@dsh-workbench/shared 1.0.0-beta.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contract/protocol/bundle-install.d.ts +1 -0
- package/dist/contract/protocol/config-sync.d.ts +1 -21
- package/dist/contract/protocol/market-index.d.ts +1 -0
- package/dist/contract/protocol/profile-create.d.ts +0 -3
- package/dist/host/git.d.ts +0 -19
- package/dist/host/git.js +1 -64
- package/dist/i18n/en.js +3 -1
- package/dist/i18n/index.d.ts +9 -21
- package/dist/i18n/settings.d.ts +5 -19
- package/dist/i18n/settings.js +7 -35
- package/dist/i18n/zh.d.ts +8 -20
- package/dist/i18n/zh.js +3 -1
- package/dist/testing/git.d.ts +3 -0
- package/dist/testing/git.js +36 -0
- package/package.json +1 -1
- package/src/contract/protocol/bundle-install.ts +1 -0
- package/src/contract/protocol/config-sync.ts +1 -24
- package/src/contract/protocol/market-index.ts +1 -0
- package/src/contract/protocol/profile-create.ts +0 -3
- package/src/host/git.ts +0 -78
- package/src/i18n/en.ts +3 -1
- package/src/i18n/settings.ts +7 -35
- package/src/i18n/zh.ts +3 -1
|
@@ -52,6 +52,7 @@ export interface WorkbenchSelfUpdate {
|
|
|
52
52
|
readonly version?: string;
|
|
53
53
|
readonly at?: string;
|
|
54
54
|
readonly tail?: string;
|
|
55
|
+
readonly migration?: 'needed';
|
|
55
56
|
}
|
|
56
57
|
export declare const RESTART_REASONS: readonly ["no-hmr", "package-moved", "host-module", "unmanaged-plugin", "module-comparison"];
|
|
57
58
|
export type RestartReason = (typeof RESTART_REASONS)[number];
|
|
@@ -1,30 +1,13 @@
|
|
|
1
1
|
export declare const CONFIG_SYNC_ROUTE = "config-sync";
|
|
2
2
|
export declare const CONFIG_SYNC_RESOURCE = "configSync";
|
|
3
|
-
export type ConfigSyncState = 'new' | 'differs'
|
|
4
|
-
export type ConfigSyncAssetState = 'missing' | 'differs' | 'same' | 'external';
|
|
5
|
-
export interface ConfigSyncAssetFile {
|
|
6
|
-
readonly path: string;
|
|
7
|
-
readonly state: ConfigSyncAssetState;
|
|
8
|
-
readonly bytes: number | null;
|
|
9
|
-
}
|
|
10
|
-
export interface ConfigSyncAsset {
|
|
11
|
-
readonly key: string;
|
|
12
|
-
readonly path: string;
|
|
13
|
-
readonly kind: 'file' | 'dir';
|
|
14
|
-
readonly state: ConfigSyncAssetState;
|
|
15
|
-
readonly files: readonly ConfigSyncAssetFile[];
|
|
16
|
-
readonly bytes: number;
|
|
17
|
-
readonly reason?: string;
|
|
18
|
-
}
|
|
3
|
+
export type ConfigSyncState = 'new' | 'differs';
|
|
19
4
|
export interface ConfigSyncRow {
|
|
20
5
|
readonly key: string;
|
|
21
6
|
readonly id: string;
|
|
22
|
-
readonly insert: boolean;
|
|
23
7
|
readonly state: ConfigSyncState;
|
|
24
8
|
readonly body: string;
|
|
25
9
|
readonly ownBody: string | null;
|
|
26
10
|
readonly missing: readonly string[];
|
|
27
|
-
readonly assets: readonly ConfigSyncAsset[];
|
|
28
11
|
}
|
|
29
12
|
export interface ConfigSyncProfile {
|
|
30
13
|
readonly name: string;
|
|
@@ -43,13 +26,10 @@ export interface ConfigSyncSnapshot {
|
|
|
43
26
|
export interface ConfigSyncApplied {
|
|
44
27
|
readonly written: readonly string[];
|
|
45
28
|
readonly skipped: readonly string[];
|
|
46
|
-
readonly files: readonly string[];
|
|
47
29
|
readonly verified: boolean;
|
|
48
30
|
}
|
|
49
31
|
export interface ConfigSyncRequest {
|
|
50
32
|
readonly source: string;
|
|
51
33
|
readonly keys: readonly string[];
|
|
52
34
|
readonly overwrite: readonly string[];
|
|
53
|
-
readonly assets?: readonly string[];
|
|
54
|
-
readonly overwriteAssets?: readonly string[];
|
|
55
35
|
}
|
|
@@ -161,6 +161,7 @@ export interface PublishChangelog {
|
|
|
161
161
|
export interface PublishPreview {
|
|
162
162
|
readonly name: string;
|
|
163
163
|
readonly version: string;
|
|
164
|
+
readonly author?: string;
|
|
164
165
|
readonly registry?: string;
|
|
165
166
|
readonly market?: MarketPublishDestination;
|
|
166
167
|
readonly changelog?: PublishChangelog;
|
|
@@ -11,9 +11,6 @@ export interface ProfileCreateSnapshot {
|
|
|
11
11
|
}
|
|
12
12
|
export interface ProfileCreateCopy {
|
|
13
13
|
readonly settings: boolean;
|
|
14
|
-
readonly plugins: boolean;
|
|
15
|
-
readonly projects: boolean;
|
|
16
|
-
readonly sessions: boolean;
|
|
17
14
|
}
|
|
18
15
|
export interface ProfileCreateRequest {
|
|
19
16
|
readonly profile: string;
|
package/dist/host/git.d.ts
CHANGED
|
@@ -1,24 +1,5 @@
|
|
|
1
|
-
import type { DshShell } from '../api/dsh.js';
|
|
2
1
|
export type { BranchRead, HeadRead, OriginRead, } from '../contract/git.js';
|
|
3
2
|
import type { BranchRead, HeadRead, OriginRead } from '../contract/git.js';
|
|
4
3
|
export type OriginReader = (path: string) => Promise<OriginRead>;
|
|
5
4
|
export type BranchReader = (path: string) => Promise<BranchRead>;
|
|
6
5
|
export type HeadReader = (path: string) => Promise<HeadRead>;
|
|
7
|
-
export declare function createHeadReader(options: {
|
|
8
|
-
shell: DshShell;
|
|
9
|
-
logger?: {
|
|
10
|
-
warn?(message: string): void;
|
|
11
|
-
} | undefined;
|
|
12
|
-
}): HeadReader;
|
|
13
|
-
export declare function createBranchReader(options: {
|
|
14
|
-
shell: DshShell;
|
|
15
|
-
logger?: {
|
|
16
|
-
warn?(message: string): void;
|
|
17
|
-
} | undefined;
|
|
18
|
-
}): BranchReader;
|
|
19
|
-
export declare function createOriginReader(options: {
|
|
20
|
-
shell: DshShell;
|
|
21
|
-
logger?: {
|
|
22
|
-
warn?(message: string): void;
|
|
23
|
-
} | undefined;
|
|
24
|
-
}): OriginReader;
|
package/dist/host/git.js
CHANGED
|
@@ -1,64 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { runShell } from '../host/shell.js';
|
|
3
|
-
export function createHeadReader(options) {
|
|
4
|
-
const { shell, logger } = options;
|
|
5
|
-
return async function readHead(path) {
|
|
6
|
-
const key = String(path ?? '').trim();
|
|
7
|
-
if (!key)
|
|
8
|
-
return { kind: 'unknown', reason: 'no-path' };
|
|
9
|
-
let result;
|
|
10
|
-
try {
|
|
11
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse HEAD`);
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
logger?.warn?.(`[dsh-workbench] git rev-parse 执行失败:${String(error)}`);
|
|
15
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
16
|
-
}
|
|
17
|
-
if (result.exitCode !== 0) {
|
|
18
|
-
return { kind: 'no-head', detail: tailLines(result.stderr, 3) };
|
|
19
|
-
}
|
|
20
|
-
return { kind: 'ok', commit: result.stdout.trim() };
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export function createBranchReader(options) {
|
|
24
|
-
const { shell, logger } = options;
|
|
25
|
-
return async function readBranch(path) {
|
|
26
|
-
const key = String(path ?? '').trim();
|
|
27
|
-
if (!key)
|
|
28
|
-
return { kind: 'unknown', reason: 'no-path' };
|
|
29
|
-
let result;
|
|
30
|
-
try {
|
|
31
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse --abbrev-ref HEAD`);
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
logger?.warn?.(`[dsh-workbench] git rev-parse --abbrev-ref 执行失败:${String(error)}`);
|
|
35
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
36
|
-
}
|
|
37
|
-
const name = result.stdout.trim();
|
|
38
|
-
if (result.exitCode !== 0)
|
|
39
|
-
return { kind: 'no-branch', detail: tailLines(result.stderr, 3) };
|
|
40
|
-
if (name === '' || name === 'HEAD')
|
|
41
|
-
return { kind: 'no-branch', detail: name };
|
|
42
|
-
return { kind: 'ok', branch: name };
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
export function createOriginReader(options) {
|
|
46
|
-
const { shell, logger } = options;
|
|
47
|
-
return async function readOrigin(path) {
|
|
48
|
-
const key = String(path ?? '').trim();
|
|
49
|
-
if (!key)
|
|
50
|
-
return { kind: 'unknown', reason: 'no-path' };
|
|
51
|
-
let result;
|
|
52
|
-
try {
|
|
53
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} remote get-url origin`);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
logger?.warn?.(`[dsh-workbench] git remote 执行失败:${String(error)}`);
|
|
57
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
58
|
-
}
|
|
59
|
-
if (result.exitCode !== 0) {
|
|
60
|
-
return { kind: 'no-origin', detail: tailLines(result.stderr, 3) };
|
|
61
|
-
}
|
|
62
|
-
return { kind: 'ok', remote: result.stdout.trim() };
|
|
63
|
-
};
|
|
64
|
-
}
|
|
1
|
+
export {};
|
package/dist/i18n/en.js
CHANGED
|
@@ -137,6 +137,7 @@ export const en = {
|
|
|
137
137
|
'panels.market.selfUpdateFailed': 'Self-update failed: {reason}',
|
|
138
138
|
'panels.market.selfUpdateUnknown': 'the outside process left no reason (see ~/.dsh/workbench/self-update.log)',
|
|
139
139
|
'panels.market.selfUpdateRolledBack': 'Not swapped; rolled back to {version}.',
|
|
140
|
+
'panels.market.selfUpdateNeedsMigrate': 'Workbench updated. Old sessions and projects are not merged automatically: quit every dsh, then run dsh-workbench migrate (--force to merge again).',
|
|
140
141
|
'panels.market.uninstall': 'Uninstall',
|
|
141
142
|
'panels.market.uninstallLabel': 'Uninstall {name}',
|
|
142
143
|
'panels.market.installing': 'Installing…',
|
|
@@ -368,7 +369,6 @@ export const en = {
|
|
|
368
369
|
'panels.discover.tabOverview': 'Overview',
|
|
369
370
|
'panels.discover.tabReadme': 'Readme',
|
|
370
371
|
'panels.discover.tabChangelog': 'Changelog',
|
|
371
|
-
'panels.discover.docTitle': '{kind} for {version}',
|
|
372
372
|
'panels.discover.docReadme': 'readme',
|
|
373
373
|
'panels.discover.docChangelog': 'changelog',
|
|
374
374
|
'panels.discover.docLoading': 'Reading…',
|
|
@@ -605,6 +605,8 @@ export const en = {
|
|
|
605
605
|
'approval.publish.module': 'Module',
|
|
606
606
|
'approval.publish.target': 'Target',
|
|
607
607
|
'approval.publish.version': 'Version',
|
|
608
|
+
'approval.publish.author': 'Author',
|
|
609
|
+
'approval.publish.authorMissing': 'unsigned (commits use the local git identity)',
|
|
608
610
|
'approval.publish.registry': 'Registry',
|
|
609
611
|
'approval.publish.repo': 'Repository',
|
|
610
612
|
'approval.publish.branch': 'Branch',
|
package/dist/i18n/index.d.ts
CHANGED
|
@@ -147,6 +147,7 @@ export declare const dictionaries: {
|
|
|
147
147
|
readonly 'panels.market.selfUpdateFailed': "自更新没成:{reason}";
|
|
148
148
|
readonly 'panels.market.selfUpdateUnknown': "外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)";
|
|
149
149
|
readonly 'panels.market.selfUpdateRolledBack': "没换成,已回滚到 {version}。";
|
|
150
|
+
readonly 'panels.market.selfUpdateNeedsMigrate': "工作台已更新。旧会话 / 项目不会自动并:先退出所有 dsh,再运行 dsh-workbench migrate(--force 可补并)。";
|
|
150
151
|
readonly 'panels.market.uninstall': "卸载";
|
|
151
152
|
readonly 'panels.market.uninstallLabel': "卸载 {name}";
|
|
152
153
|
readonly 'panels.market.installing': "正在安装…";
|
|
@@ -378,7 +379,6 @@ export declare const dictionaries: {
|
|
|
378
379
|
readonly 'panels.discover.tabOverview': "概览";
|
|
379
380
|
readonly 'panels.discover.tabReadme': "说明";
|
|
380
381
|
readonly 'panels.discover.tabChangelog': "更新日志";
|
|
381
|
-
readonly 'panels.discover.docTitle': "{version} 的{kind}";
|
|
382
382
|
readonly 'panels.discover.docReadme': "说明";
|
|
383
383
|
readonly 'panels.discover.docChangelog': "更新日志";
|
|
384
384
|
readonly 'panels.discover.docLoading': "正在读取…";
|
|
@@ -615,6 +615,8 @@ export declare const dictionaries: {
|
|
|
615
615
|
readonly 'approval.publish.module': "模块";
|
|
616
616
|
readonly 'approval.publish.target': "目标";
|
|
617
617
|
readonly 'approval.publish.version': "版本";
|
|
618
|
+
readonly 'approval.publish.author': "作者";
|
|
619
|
+
readonly 'approval.publish.authorMissing': "未署名(提交用本机 git 身份)";
|
|
618
620
|
readonly 'approval.publish.registry': "源";
|
|
619
621
|
readonly 'approval.publish.repo': "仓库";
|
|
620
622
|
readonly 'approval.publish.branch': "分支";
|
|
@@ -637,17 +639,13 @@ export declare const dictionaries: {
|
|
|
637
639
|
readonly 'markdown.copied': "已复制";
|
|
638
640
|
readonly 'markdown.footnotes': "脚注";
|
|
639
641
|
readonly 'profileCreate.nav': "新建工作台";
|
|
640
|
-
readonly 'profileCreate.lead': "以已有 profile
|
|
642
|
+
readonly 'profileCreate.lead': "以已有 profile 为模板,建一个独立的新工作台。会话 / 项目 / 附件跟 web 共用,这里只复制设置。建好后关掉当前实例,再启动新的。";
|
|
641
643
|
readonly 'profileCreate.name': "新工作台的名字";
|
|
642
644
|
readonly 'profileCreate.nameHint': "例如 wb2(只用字母、数字、点、下划线或短横线)";
|
|
643
645
|
readonly 'profileCreate.source': "来源 profile";
|
|
644
646
|
readonly 'profileCreate.current': "当前";
|
|
645
647
|
readonly 'profileCreate.copy': "从来源复制";
|
|
646
648
|
readonly 'profileCreate.settings': "设置(模型、主题等)";
|
|
647
|
-
readonly 'profileCreate.plugins': "本地插件文件";
|
|
648
|
-
readonly 'profileCreate.pluginsRequired': "设置里引用了,不能单独去掉";
|
|
649
|
-
readonly 'profileCreate.projects': "项目列表";
|
|
650
|
-
readonly 'profileCreate.sessions': "会话记录";
|
|
651
649
|
readonly 'profileCreate.create': "创建";
|
|
652
650
|
readonly 'profileCreate.creating': "正在创建…";
|
|
653
651
|
readonly 'profileCreate.created': "已建好 {profile}。";
|
|
@@ -658,25 +656,16 @@ export declare const dictionaries: {
|
|
|
658
656
|
readonly 'profileCreate.noProfiles': "这台机器上还没有可用的来源 profile。";
|
|
659
657
|
readonly 'profileCreate.failed': "创建没有成功,看看下面的输出。";
|
|
660
658
|
readonly 'configSync.nav': "配置同步";
|
|
661
|
-
readonly 'configSync.lead': "
|
|
659
|
+
readonly 'configSync.lead': "只同步「改已有插件的设置」的行;挂新插件的行不同步。会话 / 项目 / 附件本来就共用,不用同步。要整套新建工作台用「新建工作台」。";
|
|
662
660
|
readonly 'configSync.source': "来源";
|
|
663
661
|
readonly 'configSync.sourceBroken': "读不到它的配置";
|
|
664
|
-
readonly 'configSync.sourceRows': "{name} 这份里你有 {count}
|
|
662
|
+
readonly 'configSync.sourceRows': "{name} 这份里你有 {count} 行可同步";
|
|
665
663
|
readonly 'configSync.sourceDead': "读不到";
|
|
666
664
|
readonly 'configSync.refresh': "重新读一遍";
|
|
667
665
|
readonly 'configSync.loading': "正在读来源的配置…";
|
|
668
666
|
readonly 'configSync.readHint': "换个来源,或再读一遍。";
|
|
669
667
|
readonly 'configSync.tag.new': "新增";
|
|
670
668
|
readonly 'configSync.tag.differs': "差异";
|
|
671
|
-
readonly 'configSync.tag.asset': "缺文件";
|
|
672
|
-
readonly 'configSync.tag.fileDiffers': "文件不同";
|
|
673
|
-
readonly 'configSync.assetOnly': "设置内容一样,只差文件。";
|
|
674
|
-
readonly 'configSync.assetMissingOne': "还要 1 个文件:{path}";
|
|
675
|
-
readonly 'configSync.assetMissingMany': "还要 {count} 个文件:{path}";
|
|
676
|
-
readonly 'configSync.assetDiffers': "文件不一样:{path}";
|
|
677
|
-
readonly 'configSync.assetDiffersMany': "文件有差异:{path}({count} 个)";
|
|
678
|
-
readonly 'configSync.assetExternal': "这个文件搬不过来:{path}({reason})";
|
|
679
|
-
readonly 'configSync.assetOverwrite': "覆盖工作台里的同名文件";
|
|
680
669
|
readonly 'configSync.conflictNote': "应用后工作台这份会被来源覆盖";
|
|
681
670
|
readonly 'configSync.code.lang': "yaml";
|
|
682
671
|
readonly 'configSync.code.copy': "复制";
|
|
@@ -687,22 +676,21 @@ export declare const dictionaries: {
|
|
|
687
676
|
readonly 'configSync.code.collapseAria': "收起这一行的配置";
|
|
688
677
|
readonly 'configSync.code.expandAria': "展开差异(还有 {count} 行)";
|
|
689
678
|
readonly 'configSync.code.expand': "展开剩余 {count} 行";
|
|
690
|
-
readonly 'configSync.missing': "{pkg}
|
|
679
|
+
readonly 'configSync.missing': "{pkg} 还没装:这一行同步过来也不会生效 —— 先在模块市场里装它";
|
|
691
680
|
readonly 'configSync.apply': "同步选中的 {count} 项";
|
|
692
681
|
readonly 'configSync.applyNone': "请选择同步内容";
|
|
693
682
|
readonly 'configSync.applying': "正在写入…";
|
|
694
683
|
readonly 'configSync.applied': "已写入并检查通过";
|
|
695
684
|
readonly 'configSync.appliedUnverified': "已写入;重启后检查是否生效";
|
|
696
|
-
readonly 'configSync.appliedFiles': "复制了 {count} 个文件";
|
|
697
685
|
readonly 'configSync.appliedIds': "这次写进去:{ids}";
|
|
698
686
|
readonly 'configSync.skippedIds': "这几行工作台自己已有,没动:{ids}";
|
|
699
687
|
readonly 'configSync.nothing': "没有需要同步的内容";
|
|
700
688
|
readonly 'configSync.unreadable': "读不到 {path}:{reason}";
|
|
701
689
|
readonly 'configSync.noSource': "这台机器上只有工作台这一个 profile,没有可同步的来源";
|
|
702
|
-
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
690
|
+
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
|
|
703
691
|
readonly 'configSync.failed': "同步没成功,再试一次。";
|
|
704
692
|
};
|
|
705
|
-
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.plugins" | "profileCreate.pluginsRequired" | "profileCreate.projects" | "profileCreate.sessions" | "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.tag.asset" | "configSync.tag.fileDiffers" | "configSync.assetOnly" | "configSync.assetMissingOne" | "configSync.assetMissingMany" | "configSync.assetDiffers" | "configSync.assetDiffersMany" | "configSync.assetExternal" | "configSync.assetOverwrite" | "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.appliedFiles" | "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.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "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.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.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeSourceNamed" | "panels.discover.refresh" | "panels.discover.search" | "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.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.installedDone" | "panels.discover.failed" | "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.docTitle" | "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.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.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
|
|
693
|
+
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.selfUpdateNeedsMigrate" | "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.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "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.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.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeSourceNamed" | "panels.discover.refresh" | "panels.discover.search" | "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.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.installedDone" | "panels.discover.failed" | "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.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.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
|
|
706
694
|
};
|
|
707
695
|
/** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
|
|
708
696
|
export type { WorkbenchMessages };
|
package/dist/i18n/settings.d.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/** 「工作台设置」这一组的词条:配置同步 / 新建工作台。 */
|
|
2
2
|
export declare const zhSettings: {
|
|
3
3
|
readonly 'profileCreate.nav': "新建工作台";
|
|
4
|
-
readonly 'profileCreate.lead': "以已有 profile
|
|
4
|
+
readonly 'profileCreate.lead': "以已有 profile 为模板,建一个独立的新工作台。会话 / 项目 / 附件跟 web 共用,这里只复制设置。建好后关掉当前实例,再启动新的。";
|
|
5
5
|
readonly 'profileCreate.name': "新工作台的名字";
|
|
6
6
|
readonly 'profileCreate.nameHint': "例如 wb2(只用字母、数字、点、下划线或短横线)";
|
|
7
7
|
readonly 'profileCreate.source': "来源 profile";
|
|
8
8
|
readonly 'profileCreate.current': "当前";
|
|
9
9
|
readonly 'profileCreate.copy': "从来源复制";
|
|
10
10
|
readonly 'profileCreate.settings': "设置(模型、主题等)";
|
|
11
|
-
readonly 'profileCreate.plugins': "本地插件文件";
|
|
12
|
-
readonly 'profileCreate.pluginsRequired': "设置里引用了,不能单独去掉";
|
|
13
|
-
readonly 'profileCreate.projects': "项目列表";
|
|
14
|
-
readonly 'profileCreate.sessions': "会话记录";
|
|
15
11
|
readonly 'profileCreate.create': "创建";
|
|
16
12
|
readonly 'profileCreate.creating': "正在创建…";
|
|
17
13
|
readonly 'profileCreate.created': "已建好 {profile}。";
|
|
@@ -22,25 +18,16 @@ export declare const zhSettings: {
|
|
|
22
18
|
readonly 'profileCreate.noProfiles': "这台机器上还没有可用的来源 profile。";
|
|
23
19
|
readonly 'profileCreate.failed': "创建没有成功,看看下面的输出。";
|
|
24
20
|
readonly 'configSync.nav': "配置同步";
|
|
25
|
-
readonly 'configSync.lead': "
|
|
21
|
+
readonly 'configSync.lead': "只同步「改已有插件的设置」的行;挂新插件的行不同步。会话 / 项目 / 附件本来就共用,不用同步。要整套新建工作台用「新建工作台」。";
|
|
26
22
|
readonly 'configSync.source': "来源";
|
|
27
23
|
readonly 'configSync.sourceBroken': "读不到它的配置";
|
|
28
|
-
readonly 'configSync.sourceRows': "{name} 这份里你有 {count}
|
|
24
|
+
readonly 'configSync.sourceRows': "{name} 这份里你有 {count} 行可同步";
|
|
29
25
|
readonly 'configSync.sourceDead': "读不到";
|
|
30
26
|
readonly 'configSync.refresh': "重新读一遍";
|
|
31
27
|
readonly 'configSync.loading': "正在读来源的配置…";
|
|
32
28
|
readonly 'configSync.readHint': "换个来源,或再读一遍。";
|
|
33
29
|
readonly 'configSync.tag.new': "新增";
|
|
34
30
|
readonly 'configSync.tag.differs': "差异";
|
|
35
|
-
readonly 'configSync.tag.asset': "缺文件";
|
|
36
|
-
readonly 'configSync.tag.fileDiffers': "文件不同";
|
|
37
|
-
readonly 'configSync.assetOnly': "设置内容一样,只差文件。";
|
|
38
|
-
readonly 'configSync.assetMissingOne': "还要 1 个文件:{path}";
|
|
39
|
-
readonly 'configSync.assetMissingMany': "还要 {count} 个文件:{path}";
|
|
40
|
-
readonly 'configSync.assetDiffers': "文件不一样:{path}";
|
|
41
|
-
readonly 'configSync.assetDiffersMany': "文件有差异:{path}({count} 个)";
|
|
42
|
-
readonly 'configSync.assetExternal': "这个文件搬不过来:{path}({reason})";
|
|
43
|
-
readonly 'configSync.assetOverwrite': "覆盖工作台里的同名文件";
|
|
44
31
|
readonly 'configSync.conflictNote': "应用后工作台这份会被来源覆盖";
|
|
45
32
|
readonly 'configSync.code.lang': "yaml";
|
|
46
33
|
readonly 'configSync.code.copy': "复制";
|
|
@@ -51,19 +38,18 @@ export declare const zhSettings: {
|
|
|
51
38
|
readonly 'configSync.code.collapseAria': "收起这一行的配置";
|
|
52
39
|
readonly 'configSync.code.expandAria': "展开差异(还有 {count} 行)";
|
|
53
40
|
readonly 'configSync.code.expand': "展开剩余 {count} 行";
|
|
54
|
-
readonly 'configSync.missing': "{pkg}
|
|
41
|
+
readonly 'configSync.missing': "{pkg} 还没装:这一行同步过来也不会生效 —— 先在模块市场里装它";
|
|
55
42
|
readonly 'configSync.apply': "同步选中的 {count} 项";
|
|
56
43
|
readonly 'configSync.applyNone': "请选择同步内容";
|
|
57
44
|
readonly 'configSync.applying': "正在写入…";
|
|
58
45
|
readonly 'configSync.applied': "已写入并检查通过";
|
|
59
46
|
readonly 'configSync.appliedUnverified': "已写入;重启后检查是否生效";
|
|
60
|
-
readonly 'configSync.appliedFiles': "复制了 {count} 个文件";
|
|
61
47
|
readonly 'configSync.appliedIds': "这次写进去:{ids}";
|
|
62
48
|
readonly 'configSync.skippedIds': "这几行工作台自己已有,没动:{ids}";
|
|
63
49
|
readonly 'configSync.nothing': "没有需要同步的内容";
|
|
64
50
|
readonly 'configSync.unreadable': "读不到 {path}:{reason}";
|
|
65
51
|
readonly 'configSync.noSource': "这台机器上只有工作台这一个 profile,没有可同步的来源";
|
|
66
|
-
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
52
|
+
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
|
|
67
53
|
readonly 'configSync.failed': "同步没成功,再试一次。";
|
|
68
54
|
};
|
|
69
55
|
/** 上面那组的中文对照。 */
|
package/dist/i18n/settings.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/** 「工作台设置」这一组的词条:配置同步 / 新建工作台。 */
|
|
2
2
|
export const zhSettings = {
|
|
3
3
|
'profileCreate.nav': '新建工作台',
|
|
4
|
-
'profileCreate.lead': '以已有 profile
|
|
4
|
+
'profileCreate.lead': '以已有 profile 为模板,建一个独立的新工作台。会话 / 项目 / 附件跟 web 共用,这里只复制设置。建好后关掉当前实例,再启动新的。',
|
|
5
5
|
'profileCreate.name': '新工作台的名字',
|
|
6
6
|
'profileCreate.nameHint': '例如 wb2(只用字母、数字、点、下划线或短横线)',
|
|
7
7
|
'profileCreate.source': '来源 profile',
|
|
8
8
|
'profileCreate.current': '当前',
|
|
9
9
|
'profileCreate.copy': '从来源复制',
|
|
10
10
|
'profileCreate.settings': '设置(模型、主题等)',
|
|
11
|
-
'profileCreate.plugins': '本地插件文件',
|
|
12
|
-
'profileCreate.pluginsRequired': '设置里引用了,不能单独去掉',
|
|
13
|
-
'profileCreate.projects': '项目列表',
|
|
14
|
-
'profileCreate.sessions': '会话记录',
|
|
15
11
|
'profileCreate.create': '创建',
|
|
16
12
|
'profileCreate.creating': '正在创建…',
|
|
17
13
|
'profileCreate.created': '已建好 {profile}。',
|
|
@@ -22,25 +18,16 @@ export const zhSettings = {
|
|
|
22
18
|
'profileCreate.noProfiles': '这台机器上还没有可用的来源 profile。',
|
|
23
19
|
'profileCreate.failed': '创建没有成功,看看下面的输出。',
|
|
24
20
|
'configSync.nav': '配置同步',
|
|
25
|
-
'configSync.lead': '
|
|
21
|
+
'configSync.lead': '只同步「改已有插件的设置」的行;挂新插件的行不同步。会话 / 项目 / 附件本来就共用,不用同步。要整套新建工作台用「新建工作台」。',
|
|
26
22
|
'configSync.source': '来源',
|
|
27
23
|
'configSync.sourceBroken': '读不到它的配置',
|
|
28
|
-
'configSync.sourceRows': '{name} 这份里你有 {count}
|
|
24
|
+
'configSync.sourceRows': '{name} 这份里你有 {count} 行可同步',
|
|
29
25
|
'configSync.sourceDead': '读不到',
|
|
30
26
|
'configSync.refresh': '重新读一遍',
|
|
31
27
|
'configSync.loading': '正在读来源的配置…',
|
|
32
28
|
'configSync.readHint': '换个来源,或再读一遍。',
|
|
33
29
|
'configSync.tag.new': '新增',
|
|
34
30
|
'configSync.tag.differs': '差异',
|
|
35
|
-
'configSync.tag.asset': '缺文件',
|
|
36
|
-
'configSync.tag.fileDiffers': '文件不同',
|
|
37
|
-
'configSync.assetOnly': '设置内容一样,只差文件。',
|
|
38
|
-
'configSync.assetMissingOne': '还要 1 个文件:{path}',
|
|
39
|
-
'configSync.assetMissingMany': '还要 {count} 个文件:{path}',
|
|
40
|
-
'configSync.assetDiffers': '文件不一样:{path}',
|
|
41
|
-
'configSync.assetDiffersMany': '文件有差异:{path}({count} 个)',
|
|
42
|
-
'configSync.assetExternal': '这个文件搬不过来:{path}({reason})',
|
|
43
|
-
'configSync.assetOverwrite': '覆盖工作台里的同名文件',
|
|
44
31
|
'configSync.conflictNote': '应用后工作台这份会被来源覆盖',
|
|
45
32
|
'configSync.code.lang': 'yaml',
|
|
46
33
|
'configSync.code.copy': '复制',
|
|
@@ -51,35 +38,30 @@ export const zhSettings = {
|
|
|
51
38
|
'configSync.code.collapseAria': '收起这一行的配置',
|
|
52
39
|
'configSync.code.expandAria': '展开差异(还有 {count} 行)',
|
|
53
40
|
'configSync.code.expand': '展开剩余 {count} 行',
|
|
54
|
-
'configSync.missing': '{pkg}
|
|
41
|
+
'configSync.missing': '{pkg} 还没装:这一行同步过来也不会生效 —— 先在模块市场里装它',
|
|
55
42
|
'configSync.apply': '同步选中的 {count} 项',
|
|
56
43
|
'configSync.applyNone': '请选择同步内容',
|
|
57
44
|
'configSync.applying': '正在写入…',
|
|
58
45
|
'configSync.applied': '已写入并检查通过',
|
|
59
46
|
'configSync.appliedUnverified': '已写入;重启后检查是否生效',
|
|
60
|
-
'configSync.appliedFiles': '复制了 {count} 个文件',
|
|
61
47
|
'configSync.appliedIds': '这次写进去:{ids}',
|
|
62
48
|
'configSync.skippedIds': '这几行工作台自己已有,没动:{ids}',
|
|
63
49
|
'configSync.nothing': '没有需要同步的内容',
|
|
64
50
|
'configSync.unreadable': '读不到 {path}:{reason}',
|
|
65
51
|
'configSync.noSource': '这台机器上只有工作台这一个 profile,没有可同步的来源',
|
|
66
|
-
'configSync.emptyProviders': '工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
52
|
+
'configSync.emptyProviders': '工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。',
|
|
67
53
|
'configSync.failed': '同步没成功,再试一次。',
|
|
68
54
|
};
|
|
69
55
|
/** 上面那组的中文对照。 */
|
|
70
56
|
export const enSettings = {
|
|
71
57
|
'profileCreate.nav': 'New workbench',
|
|
72
|
-
'profileCreate.lead': 'Create a separate workbench from an existing profile. Stop this instance, then start the new one.',
|
|
58
|
+
'profileCreate.lead': 'Create a separate workbench from an existing profile. Chats, projects and attachments are shared with web; only settings are copied. Stop this instance, then start the new one.',
|
|
73
59
|
'profileCreate.name': 'New workbench name',
|
|
74
60
|
'profileCreate.nameHint': 'e.g. wb2 (letters, digits, dot, underscore or dash)',
|
|
75
61
|
'profileCreate.source': 'Source profile',
|
|
76
62
|
'profileCreate.current': 'current',
|
|
77
63
|
'profileCreate.copy': 'Copy from the source',
|
|
78
64
|
'profileCreate.settings': 'Settings (models, theme, …)',
|
|
79
|
-
'profileCreate.plugins': 'Local plugin files',
|
|
80
|
-
'profileCreate.pluginsRequired': 'Referenced by settings; copied together',
|
|
81
|
-
'profileCreate.projects': 'Project list',
|
|
82
|
-
'profileCreate.sessions': 'Chat history',
|
|
83
65
|
'profileCreate.create': 'Create',
|
|
84
66
|
'profileCreate.creating': 'Creating…',
|
|
85
67
|
'profileCreate.created': 'Created {profile}.',
|
|
@@ -90,7 +72,7 @@ export const enSettings = {
|
|
|
90
72
|
'profileCreate.noProfiles': 'This machine has no source profile yet.',
|
|
91
73
|
'profileCreate.failed': 'The workbench was not created; see the output below.',
|
|
92
74
|
'configSync.nav': 'Config sync',
|
|
93
|
-
'configSync.lead': 'Only
|
|
75
|
+
'configSync.lead': 'Only rows that change settings of plugins the workbench already has are copied. Rows that mount a new plugin are not; chats, projects and attachments are shared already. Use “New workbench” to create a full profile.',
|
|
94
76
|
'configSync.source': 'Source',
|
|
95
77
|
'configSync.sourceBroken': 'its config is unreadable',
|
|
96
78
|
'configSync.sourceRows': '{name}: {count} rows are new or different for the workbench',
|
|
@@ -100,15 +82,6 @@ export const enSettings = {
|
|
|
100
82
|
'configSync.readHint': 'Pick another source, or read again.',
|
|
101
83
|
'configSync.tag.new': 'New',
|
|
102
84
|
'configSync.tag.differs': 'Differs',
|
|
103
|
-
'configSync.tag.asset': 'File missing',
|
|
104
|
-
'configSync.tag.fileDiffers': 'File differs',
|
|
105
|
-
'configSync.assetOnly': 'The setting is the same; only its file is missing.',
|
|
106
|
-
'configSync.assetMissingOne': '1 file is still needed: {path}',
|
|
107
|
-
'configSync.assetMissingMany': '{count} files are still needed: {path}',
|
|
108
|
-
'configSync.assetDiffers': 'The file differs: {path}',
|
|
109
|
-
'configSync.assetDiffersMany': 'The files differ: {path} ({count} files)',
|
|
110
|
-
'configSync.assetExternal': 'This file cannot be copied: {path} ({reason})',
|
|
111
|
-
'configSync.assetOverwrite': 'Overwrite the workbench copy',
|
|
112
85
|
'configSync.conflictNote': 'Applying replaces this workbench copy with the source',
|
|
113
86
|
'configSync.code.lang': 'yaml',
|
|
114
87
|
'configSync.code.copy': 'Copy',
|
|
@@ -125,7 +98,6 @@ export const enSettings = {
|
|
|
125
98
|
'configSync.applying': 'Writing…',
|
|
126
99
|
'configSync.applied': 'Written and checked',
|
|
127
100
|
'configSync.appliedUnverified': 'Written; restart to check whether it took effect',
|
|
128
|
-
'configSync.appliedFiles': 'Copied {count} files',
|
|
129
101
|
'configSync.appliedIds': 'Written this time: {ids}',
|
|
130
102
|
'configSync.skippedIds': 'Left alone (already here): {ids}',
|
|
131
103
|
'configSync.nothing': 'Nothing to sync',
|
package/dist/i18n/zh.d.ts
CHANGED
|
@@ -145,6 +145,7 @@ export declare const zh: {
|
|
|
145
145
|
readonly 'panels.market.selfUpdateFailed': "自更新没成:{reason}";
|
|
146
146
|
readonly 'panels.market.selfUpdateUnknown': "外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)";
|
|
147
147
|
readonly 'panels.market.selfUpdateRolledBack': "没换成,已回滚到 {version}。";
|
|
148
|
+
readonly 'panels.market.selfUpdateNeedsMigrate': "工作台已更新。旧会话 / 项目不会自动并:先退出所有 dsh,再运行 dsh-workbench migrate(--force 可补并)。";
|
|
148
149
|
readonly 'panels.market.uninstall': "卸载";
|
|
149
150
|
readonly 'panels.market.uninstallLabel': "卸载 {name}";
|
|
150
151
|
readonly 'panels.market.installing': "正在安装…";
|
|
@@ -376,7 +377,6 @@ export declare const zh: {
|
|
|
376
377
|
readonly 'panels.discover.tabOverview': "概览";
|
|
377
378
|
readonly 'panels.discover.tabReadme': "说明";
|
|
378
379
|
readonly 'panels.discover.tabChangelog': "更新日志";
|
|
379
|
-
readonly 'panels.discover.docTitle': "{version} 的{kind}";
|
|
380
380
|
readonly 'panels.discover.docReadme': "说明";
|
|
381
381
|
readonly 'panels.discover.docChangelog': "更新日志";
|
|
382
382
|
readonly 'panels.discover.docLoading': "正在读取…";
|
|
@@ -613,6 +613,8 @@ export declare const zh: {
|
|
|
613
613
|
readonly 'approval.publish.module': "模块";
|
|
614
614
|
readonly 'approval.publish.target': "目标";
|
|
615
615
|
readonly 'approval.publish.version': "版本";
|
|
616
|
+
readonly 'approval.publish.author': "作者";
|
|
617
|
+
readonly 'approval.publish.authorMissing': "未署名(提交用本机 git 身份)";
|
|
616
618
|
readonly 'approval.publish.registry': "源";
|
|
617
619
|
readonly 'approval.publish.repo': "仓库";
|
|
618
620
|
readonly 'approval.publish.branch': "分支";
|
|
@@ -635,17 +637,13 @@ export declare const zh: {
|
|
|
635
637
|
readonly 'markdown.copied': "已复制";
|
|
636
638
|
readonly 'markdown.footnotes': "脚注";
|
|
637
639
|
readonly 'profileCreate.nav': "新建工作台";
|
|
638
|
-
readonly 'profileCreate.lead': "以已有 profile
|
|
640
|
+
readonly 'profileCreate.lead': "以已有 profile 为模板,建一个独立的新工作台。会话 / 项目 / 附件跟 web 共用,这里只复制设置。建好后关掉当前实例,再启动新的。";
|
|
639
641
|
readonly 'profileCreate.name': "新工作台的名字";
|
|
640
642
|
readonly 'profileCreate.nameHint': "例如 wb2(只用字母、数字、点、下划线或短横线)";
|
|
641
643
|
readonly 'profileCreate.source': "来源 profile";
|
|
642
644
|
readonly 'profileCreate.current': "当前";
|
|
643
645
|
readonly 'profileCreate.copy': "从来源复制";
|
|
644
646
|
readonly 'profileCreate.settings': "设置(模型、主题等)";
|
|
645
|
-
readonly 'profileCreate.plugins': "本地插件文件";
|
|
646
|
-
readonly 'profileCreate.pluginsRequired': "设置里引用了,不能单独去掉";
|
|
647
|
-
readonly 'profileCreate.projects': "项目列表";
|
|
648
|
-
readonly 'profileCreate.sessions': "会话记录";
|
|
649
647
|
readonly 'profileCreate.create': "创建";
|
|
650
648
|
readonly 'profileCreate.creating': "正在创建…";
|
|
651
649
|
readonly 'profileCreate.created': "已建好 {profile}。";
|
|
@@ -656,25 +654,16 @@ export declare const zh: {
|
|
|
656
654
|
readonly 'profileCreate.noProfiles': "这台机器上还没有可用的来源 profile。";
|
|
657
655
|
readonly 'profileCreate.failed': "创建没有成功,看看下面的输出。";
|
|
658
656
|
readonly 'configSync.nav': "配置同步";
|
|
659
|
-
readonly 'configSync.lead': "
|
|
657
|
+
readonly 'configSync.lead': "只同步「改已有插件的设置」的行;挂新插件的行不同步。会话 / 项目 / 附件本来就共用,不用同步。要整套新建工作台用「新建工作台」。";
|
|
660
658
|
readonly 'configSync.source': "来源";
|
|
661
659
|
readonly 'configSync.sourceBroken': "读不到它的配置";
|
|
662
|
-
readonly 'configSync.sourceRows': "{name} 这份里你有 {count}
|
|
660
|
+
readonly 'configSync.sourceRows': "{name} 这份里你有 {count} 行可同步";
|
|
663
661
|
readonly 'configSync.sourceDead': "读不到";
|
|
664
662
|
readonly 'configSync.refresh': "重新读一遍";
|
|
665
663
|
readonly 'configSync.loading': "正在读来源的配置…";
|
|
666
664
|
readonly 'configSync.readHint': "换个来源,或再读一遍。";
|
|
667
665
|
readonly 'configSync.tag.new': "新增";
|
|
668
666
|
readonly 'configSync.tag.differs': "差异";
|
|
669
|
-
readonly 'configSync.tag.asset': "缺文件";
|
|
670
|
-
readonly 'configSync.tag.fileDiffers': "文件不同";
|
|
671
|
-
readonly 'configSync.assetOnly': "设置内容一样,只差文件。";
|
|
672
|
-
readonly 'configSync.assetMissingOne': "还要 1 个文件:{path}";
|
|
673
|
-
readonly 'configSync.assetMissingMany': "还要 {count} 个文件:{path}";
|
|
674
|
-
readonly 'configSync.assetDiffers': "文件不一样:{path}";
|
|
675
|
-
readonly 'configSync.assetDiffersMany': "文件有差异:{path}({count} 个)";
|
|
676
|
-
readonly 'configSync.assetExternal': "这个文件搬不过来:{path}({reason})";
|
|
677
|
-
readonly 'configSync.assetOverwrite': "覆盖工作台里的同名文件";
|
|
678
667
|
readonly 'configSync.conflictNote': "应用后工作台这份会被来源覆盖";
|
|
679
668
|
readonly 'configSync.code.lang': "yaml";
|
|
680
669
|
readonly 'configSync.code.copy': "复制";
|
|
@@ -685,19 +674,18 @@ export declare const zh: {
|
|
|
685
674
|
readonly 'configSync.code.collapseAria': "收起这一行的配置";
|
|
686
675
|
readonly 'configSync.code.expandAria': "展开差异(还有 {count} 行)";
|
|
687
676
|
readonly 'configSync.code.expand': "展开剩余 {count} 行";
|
|
688
|
-
readonly 'configSync.missing': "{pkg}
|
|
677
|
+
readonly 'configSync.missing': "{pkg} 还没装:这一行同步过来也不会生效 —— 先在模块市场里装它";
|
|
689
678
|
readonly 'configSync.apply': "同步选中的 {count} 项";
|
|
690
679
|
readonly 'configSync.applyNone': "请选择同步内容";
|
|
691
680
|
readonly 'configSync.applying': "正在写入…";
|
|
692
681
|
readonly 'configSync.applied': "已写入并检查通过";
|
|
693
682
|
readonly 'configSync.appliedUnverified': "已写入;重启后检查是否生效";
|
|
694
|
-
readonly 'configSync.appliedFiles': "复制了 {count} 个文件";
|
|
695
683
|
readonly 'configSync.appliedIds': "这次写进去:{ids}";
|
|
696
684
|
readonly 'configSync.skippedIds': "这几行工作台自己已有,没动:{ids}";
|
|
697
685
|
readonly 'configSync.nothing': "没有需要同步的内容";
|
|
698
686
|
readonly 'configSync.unreadable': "读不到 {path}:{reason}";
|
|
699
687
|
readonly 'configSync.noSource': "这台机器上只有工作台这一个 profile,没有可同步的来源";
|
|
700
|
-
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
688
|
+
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
|
|
701
689
|
readonly 'configSync.failed': "同步没成功,再试一次。";
|
|
702
690
|
};
|
|
703
691
|
/** 中文词表的键类型:`en` 与模块词表都得覆盖同一批键。 */
|
package/dist/i18n/zh.js
CHANGED
|
@@ -137,6 +137,7 @@ export const zh = {
|
|
|
137
137
|
'panels.market.selfUpdateFailed': '自更新没成:{reason}',
|
|
138
138
|
'panels.market.selfUpdateUnknown': '外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)',
|
|
139
139
|
'panels.market.selfUpdateRolledBack': '没换成,已回滚到 {version}。',
|
|
140
|
+
'panels.market.selfUpdateNeedsMigrate': '工作台已更新。旧会话 / 项目不会自动并:先退出所有 dsh,再运行 dsh-workbench migrate(--force 可补并)。',
|
|
140
141
|
'panels.market.uninstall': '卸载',
|
|
141
142
|
'panels.market.uninstallLabel': '卸载 {name}',
|
|
142
143
|
'panels.market.installing': '正在安装…',
|
|
@@ -368,7 +369,6 @@ export const zh = {
|
|
|
368
369
|
'panels.discover.tabOverview': '概览',
|
|
369
370
|
'panels.discover.tabReadme': '说明',
|
|
370
371
|
'panels.discover.tabChangelog': '更新日志',
|
|
371
|
-
'panels.discover.docTitle': '{version} 的{kind}',
|
|
372
372
|
'panels.discover.docReadme': '说明',
|
|
373
373
|
'panels.discover.docChangelog': '更新日志',
|
|
374
374
|
'panels.discover.docLoading': '正在读取…',
|
|
@@ -605,6 +605,8 @@ export const zh = {
|
|
|
605
605
|
'approval.publish.module': '模块',
|
|
606
606
|
'approval.publish.target': '目标',
|
|
607
607
|
'approval.publish.version': '版本',
|
|
608
|
+
'approval.publish.author': '作者',
|
|
609
|
+
'approval.publish.authorMissing': '未署名(提交用本机 git 身份)',
|
|
608
610
|
'approval.publish.registry': '源',
|
|
609
611
|
'approval.publish.repo': '仓库',
|
|
610
612
|
'approval.publish.branch': '分支',
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { quoteShellArg, tailLines } from '../host/shell-text.js';
|
|
2
|
+
import { runShell } from '../host/shell.js';
|
|
3
|
+
export function createFakeGit(shell) {
|
|
4
|
+
return {
|
|
5
|
+
async origin(path) {
|
|
6
|
+
const key = path.trim();
|
|
7
|
+
if (!key)
|
|
8
|
+
return { kind: 'unknown', reason: 'no-path' };
|
|
9
|
+
const result = await runShell(shell, `git -C ${quoteShellArg(key)} remote get-url origin`);
|
|
10
|
+
if (result.exitCode !== 0)
|
|
11
|
+
return { kind: 'no-origin', detail: tailLines(result.stderr, 3) };
|
|
12
|
+
return { kind: 'ok', remote: result.stdout.trim() };
|
|
13
|
+
},
|
|
14
|
+
async branch(path) {
|
|
15
|
+
const key = path.trim();
|
|
16
|
+
if (!key)
|
|
17
|
+
return { kind: 'unknown', reason: 'no-path' };
|
|
18
|
+
const result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse --abbrev-ref HEAD`);
|
|
19
|
+
const name = result.stdout.trim();
|
|
20
|
+
if (result.exitCode !== 0)
|
|
21
|
+
return { kind: 'no-branch', detail: tailLines(result.stderr, 3) };
|
|
22
|
+
if (name === '' || name === 'HEAD')
|
|
23
|
+
return { kind: 'no-branch', detail: name };
|
|
24
|
+
return { kind: 'ok', branch: name };
|
|
25
|
+
},
|
|
26
|
+
async head(path) {
|
|
27
|
+
const key = path.trim();
|
|
28
|
+
if (!key)
|
|
29
|
+
return { kind: 'unknown', reason: 'no-path' };
|
|
30
|
+
const result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse HEAD`);
|
|
31
|
+
if (result.exitCode !== 0)
|
|
32
|
+
return { kind: 'no-head', detail: tailLines(result.stderr, 3) };
|
|
33
|
+
return { kind: 'ok', commit: result.stdout.trim() };
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -2,35 +2,15 @@ export const CONFIG_SYNC_ROUTE = 'config-sync';
|
|
|
2
2
|
|
|
3
3
|
export const CONFIG_SYNC_RESOURCE = 'configSync';
|
|
4
4
|
|
|
5
|
-
export type ConfigSyncState = 'new' | 'differs'
|
|
6
|
-
|
|
7
|
-
export type ConfigSyncAssetState = 'missing' | 'differs' | 'same' | 'external';
|
|
8
|
-
|
|
9
|
-
export interface ConfigSyncAssetFile {
|
|
10
|
-
readonly path: string;
|
|
11
|
-
readonly state: ConfigSyncAssetState;
|
|
12
|
-
readonly bytes: number | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface ConfigSyncAsset {
|
|
16
|
-
readonly key: string;
|
|
17
|
-
readonly path: string;
|
|
18
|
-
readonly kind: 'file' | 'dir';
|
|
19
|
-
readonly state: ConfigSyncAssetState;
|
|
20
|
-
readonly files: readonly ConfigSyncAssetFile[];
|
|
21
|
-
readonly bytes: number;
|
|
22
|
-
readonly reason?: string;
|
|
23
|
-
}
|
|
5
|
+
export type ConfigSyncState = 'new' | 'differs';
|
|
24
6
|
|
|
25
7
|
export interface ConfigSyncRow {
|
|
26
8
|
readonly key: string;
|
|
27
9
|
readonly id: string;
|
|
28
|
-
readonly insert: boolean;
|
|
29
10
|
readonly state: ConfigSyncState;
|
|
30
11
|
readonly body: string;
|
|
31
12
|
readonly ownBody: string | null;
|
|
32
13
|
readonly missing: readonly string[];
|
|
33
|
-
readonly assets: readonly ConfigSyncAsset[];
|
|
34
14
|
}
|
|
35
15
|
|
|
36
16
|
export interface ConfigSyncProfile {
|
|
@@ -52,7 +32,6 @@ export interface ConfigSyncSnapshot {
|
|
|
52
32
|
export interface ConfigSyncApplied {
|
|
53
33
|
readonly written: readonly string[];
|
|
54
34
|
readonly skipped: readonly string[];
|
|
55
|
-
readonly files: readonly string[];
|
|
56
35
|
readonly verified: boolean;
|
|
57
36
|
}
|
|
58
37
|
|
|
@@ -60,6 +39,4 @@ export interface ConfigSyncRequest {
|
|
|
60
39
|
readonly source: string;
|
|
61
40
|
readonly keys: readonly string[];
|
|
62
41
|
readonly overwrite: readonly string[];
|
|
63
|
-
readonly assets?: readonly string[];
|
|
64
|
-
readonly overwriteAssets?: readonly string[];
|
|
65
42
|
}
|
|
@@ -217,6 +217,7 @@ export interface PublishChangelog {
|
|
|
217
217
|
export interface PublishPreview {
|
|
218
218
|
readonly name: string;
|
|
219
219
|
readonly version: string;
|
|
220
|
+
readonly author?: string;
|
|
220
221
|
readonly registry?: string;
|
|
221
222
|
readonly market?: MarketPublishDestination;
|
|
222
223
|
readonly changelog?: PublishChangelog;
|
package/src/host/git.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { DshShell } from '../api/dsh.js';
|
|
2
|
-
import { quoteShellArg, tailLines } from '../host/shell-text.js';
|
|
3
|
-
import { runShell } from '../host/shell.js';
|
|
4
1
|
|
|
5
2
|
export type {
|
|
6
3
|
BranchRead,
|
|
@@ -14,78 +11,3 @@ export type OriginReader = (path: string) => Promise<OriginRead>;
|
|
|
14
11
|
export type BranchReader = (path: string) => Promise<BranchRead>;
|
|
15
12
|
|
|
16
13
|
export type HeadReader = (path: string) => Promise<HeadRead>;
|
|
17
|
-
|
|
18
|
-
export function createHeadReader(options: {
|
|
19
|
-
shell: DshShell;
|
|
20
|
-
logger?: { warn?(message: string): void } | undefined;
|
|
21
|
-
}): HeadReader {
|
|
22
|
-
const { shell, logger } = options;
|
|
23
|
-
|
|
24
|
-
return async function readHead(path: string): Promise<HeadRead> {
|
|
25
|
-
const key = String(path ?? '').trim();
|
|
26
|
-
if (!key) return { kind: 'unknown', reason: 'no-path' };
|
|
27
|
-
|
|
28
|
-
let result;
|
|
29
|
-
try {
|
|
30
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse HEAD`);
|
|
31
|
-
} catch (error) {
|
|
32
|
-
logger?.warn?.(`[dsh-workbench] git rev-parse 执行失败:${String(error)}`);
|
|
33
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (result.exitCode !== 0) {
|
|
37
|
-
return { kind: 'no-head', detail: tailLines(result.stderr, 3) };
|
|
38
|
-
}
|
|
39
|
-
return { kind: 'ok', commit: result.stdout.trim() };
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function createBranchReader(options: {
|
|
44
|
-
shell: DshShell;
|
|
45
|
-
logger?: { warn?(message: string): void } | undefined;
|
|
46
|
-
}): BranchReader {
|
|
47
|
-
const { shell, logger } = options;
|
|
48
|
-
|
|
49
|
-
return async function readBranch(path: string): Promise<BranchRead> {
|
|
50
|
-
const key = String(path ?? '').trim();
|
|
51
|
-
if (!key) return { kind: 'unknown', reason: 'no-path' };
|
|
52
|
-
|
|
53
|
-
let result;
|
|
54
|
-
try {
|
|
55
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} rev-parse --abbrev-ref HEAD`);
|
|
56
|
-
} catch (error) {
|
|
57
|
-
logger?.warn?.(`[dsh-workbench] git rev-parse --abbrev-ref 执行失败:${String(error)}`);
|
|
58
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const name = result.stdout.trim();
|
|
62
|
-
if (result.exitCode !== 0) return { kind: 'no-branch', detail: tailLines(result.stderr, 3) };
|
|
63
|
-
if (name === '' || name === 'HEAD') return { kind: 'no-branch', detail: name };
|
|
64
|
-
return { kind: 'ok', branch: name };
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function createOriginReader(options: {
|
|
69
|
-
shell: DshShell;
|
|
70
|
-
logger?: { warn?(message: string): void } | undefined;
|
|
71
|
-
}): OriginReader {
|
|
72
|
-
const { shell, logger } = options;
|
|
73
|
-
|
|
74
|
-
return async function readOrigin(path: string): Promise<OriginRead> {
|
|
75
|
-
const key = String(path ?? '').trim();
|
|
76
|
-
if (!key) return { kind: 'unknown', reason: 'no-path' };
|
|
77
|
-
|
|
78
|
-
let result;
|
|
79
|
-
try {
|
|
80
|
-
result = await runShell(shell, `git -C ${quoteShellArg(key)} remote get-url origin`);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
logger?.warn?.(`[dsh-workbench] git remote 执行失败:${String(error)}`);
|
|
83
|
-
return { kind: 'unknown', reason: 'exec-failed', detail: String(error) };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (result.exitCode !== 0) {
|
|
87
|
-
return { kind: 'no-origin', detail: tailLines(result.stderr, 3) };
|
|
88
|
-
}
|
|
89
|
-
return { kind: 'ok', remote: result.stdout.trim() };
|
|
90
|
-
};
|
|
91
|
-
}
|
package/src/i18n/en.ts
CHANGED
|
@@ -142,6 +142,7 @@ export const en: Record<keyof WorkbenchMessages, string> = {
|
|
|
142
142
|
'panels.market.selfUpdateFailed': 'Self-update failed: {reason}',
|
|
143
143
|
'panels.market.selfUpdateUnknown': 'the outside process left no reason (see ~/.dsh/workbench/self-update.log)',
|
|
144
144
|
'panels.market.selfUpdateRolledBack': 'Not swapped; rolled back to {version}.',
|
|
145
|
+
'panels.market.selfUpdateNeedsMigrate': 'Workbench updated. Old sessions and projects are not merged automatically: quit every dsh, then run dsh-workbench migrate (--force to merge again).',
|
|
145
146
|
'panels.market.uninstall': 'Uninstall',
|
|
146
147
|
'panels.market.uninstallLabel': 'Uninstall {name}',
|
|
147
148
|
'panels.market.installing': 'Installing…',
|
|
@@ -378,7 +379,6 @@ export const en: Record<keyof WorkbenchMessages, string> = {
|
|
|
378
379
|
'panels.discover.tabOverview': 'Overview',
|
|
379
380
|
'panels.discover.tabReadme': 'Readme',
|
|
380
381
|
'panels.discover.tabChangelog': 'Changelog',
|
|
381
|
-
'panels.discover.docTitle': '{kind} for {version}',
|
|
382
382
|
'panels.discover.docReadme': 'readme',
|
|
383
383
|
'panels.discover.docChangelog': 'changelog',
|
|
384
384
|
'panels.discover.docLoading': 'Reading…',
|
|
@@ -623,6 +623,8 @@ export const en: Record<keyof WorkbenchMessages, string> = {
|
|
|
623
623
|
'approval.publish.module': 'Module',
|
|
624
624
|
'approval.publish.target': 'Target',
|
|
625
625
|
'approval.publish.version': 'Version',
|
|
626
|
+
'approval.publish.author': 'Author',
|
|
627
|
+
'approval.publish.authorMissing': 'unsigned (commits use the local git identity)',
|
|
626
628
|
'approval.publish.registry': 'Registry',
|
|
627
629
|
'approval.publish.repo': 'Repository',
|
|
628
630
|
'approval.publish.branch': 'Branch',
|
package/src/i18n/settings.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/** 「工作台设置」这一组的词条:配置同步 / 新建工作台。 */
|
|
2
2
|
export const zhSettings = {
|
|
3
3
|
'profileCreate.nav': '新建工作台',
|
|
4
|
-
'profileCreate.lead': '以已有 profile
|
|
4
|
+
'profileCreate.lead': '以已有 profile 为模板,建一个独立的新工作台。会话 / 项目 / 附件跟 web 共用,这里只复制设置。建好后关掉当前实例,再启动新的。',
|
|
5
5
|
'profileCreate.name': '新工作台的名字',
|
|
6
6
|
'profileCreate.nameHint': '例如 wb2(只用字母、数字、点、下划线或短横线)',
|
|
7
7
|
'profileCreate.source': '来源 profile',
|
|
8
8
|
'profileCreate.current': '当前',
|
|
9
9
|
'profileCreate.copy': '从来源复制',
|
|
10
10
|
'profileCreate.settings': '设置(模型、主题等)',
|
|
11
|
-
'profileCreate.plugins': '本地插件文件',
|
|
12
|
-
'profileCreate.pluginsRequired': '设置里引用了,不能单独去掉',
|
|
13
|
-
'profileCreate.projects': '项目列表',
|
|
14
|
-
'profileCreate.sessions': '会话记录',
|
|
15
11
|
'profileCreate.create': '创建',
|
|
16
12
|
'profileCreate.creating': '正在创建…',
|
|
17
13
|
'profileCreate.created': '已建好 {profile}。',
|
|
@@ -23,25 +19,16 @@ export const zhSettings = {
|
|
|
23
19
|
'profileCreate.failed': '创建没有成功,看看下面的输出。',
|
|
24
20
|
|
|
25
21
|
'configSync.nav': '配置同步',
|
|
26
|
-
'configSync.lead': '
|
|
22
|
+
'configSync.lead': '只同步「改已有插件的设置」的行;挂新插件的行不同步。会话 / 项目 / 附件本来就共用,不用同步。要整套新建工作台用「新建工作台」。',
|
|
27
23
|
'configSync.source': '来源',
|
|
28
24
|
'configSync.sourceBroken': '读不到它的配置',
|
|
29
|
-
'configSync.sourceRows': '{name} 这份里你有 {count}
|
|
25
|
+
'configSync.sourceRows': '{name} 这份里你有 {count} 行可同步',
|
|
30
26
|
'configSync.sourceDead': '读不到',
|
|
31
27
|
'configSync.refresh': '重新读一遍',
|
|
32
28
|
'configSync.loading': '正在读来源的配置…',
|
|
33
29
|
'configSync.readHint': '换个来源,或再读一遍。',
|
|
34
30
|
'configSync.tag.new': '新增',
|
|
35
31
|
'configSync.tag.differs': '差异',
|
|
36
|
-
'configSync.tag.asset': '缺文件',
|
|
37
|
-
'configSync.tag.fileDiffers': '文件不同',
|
|
38
|
-
'configSync.assetOnly': '设置内容一样,只差文件。',
|
|
39
|
-
'configSync.assetMissingOne': '还要 1 个文件:{path}',
|
|
40
|
-
'configSync.assetMissingMany': '还要 {count} 个文件:{path}',
|
|
41
|
-
'configSync.assetDiffers': '文件不一样:{path}',
|
|
42
|
-
'configSync.assetDiffersMany': '文件有差异:{path}({count} 个)',
|
|
43
|
-
'configSync.assetExternal': '这个文件搬不过来:{path}({reason})',
|
|
44
|
-
'configSync.assetOverwrite': '覆盖工作台里的同名文件',
|
|
45
32
|
'configSync.conflictNote': '应用后工作台这份会被来源覆盖',
|
|
46
33
|
'configSync.code.lang': 'yaml',
|
|
47
34
|
'configSync.code.copy': '复制',
|
|
@@ -52,19 +39,18 @@ export const zhSettings = {
|
|
|
52
39
|
'configSync.code.collapseAria': '收起这一行的配置',
|
|
53
40
|
'configSync.code.expandAria': '展开差异(还有 {count} 行)',
|
|
54
41
|
'configSync.code.expand': '展开剩余 {count} 行',
|
|
55
|
-
'configSync.missing': '{pkg}
|
|
42
|
+
'configSync.missing': '{pkg} 还没装:这一行同步过来也不会生效 —— 先在模块市场里装它',
|
|
56
43
|
'configSync.apply': '同步选中的 {count} 项',
|
|
57
44
|
'configSync.applyNone': '请选择同步内容',
|
|
58
45
|
'configSync.applying': '正在写入…',
|
|
59
46
|
'configSync.applied': '已写入并检查通过',
|
|
60
47
|
'configSync.appliedUnverified': '已写入;重启后检查是否生效',
|
|
61
|
-
'configSync.appliedFiles': '复制了 {count} 个文件',
|
|
62
48
|
'configSync.appliedIds': '这次写进去:{ids}',
|
|
63
49
|
'configSync.skippedIds': '这几行工作台自己已有,没动:{ids}',
|
|
64
50
|
'configSync.nothing': '没有需要同步的内容',
|
|
65
51
|
'configSync.unreadable': '读不到 {path}:{reason}',
|
|
66
52
|
'configSync.noSource': '这台机器上只有工作台这一个 profile,没有可同步的来源',
|
|
67
|
-
'configSync.emptyProviders': '工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
53
|
+
'configSync.emptyProviders': '工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。',
|
|
68
54
|
'configSync.failed': '同步没成功,再试一次。',
|
|
69
55
|
|
|
70
56
|
} as const;
|
|
@@ -72,17 +58,13 @@ export const zhSettings = {
|
|
|
72
58
|
/** 上面那组的中文对照。 */
|
|
73
59
|
export const enSettings: Record<keyof typeof zhSettings, string> = {
|
|
74
60
|
'profileCreate.nav': 'New workbench',
|
|
75
|
-
'profileCreate.lead': 'Create a separate workbench from an existing profile. Stop this instance, then start the new one.',
|
|
61
|
+
'profileCreate.lead': 'Create a separate workbench from an existing profile. Chats, projects and attachments are shared with web; only settings are copied. Stop this instance, then start the new one.',
|
|
76
62
|
'profileCreate.name': 'New workbench name',
|
|
77
63
|
'profileCreate.nameHint': 'e.g. wb2 (letters, digits, dot, underscore or dash)',
|
|
78
64
|
'profileCreate.source': 'Source profile',
|
|
79
65
|
'profileCreate.current': 'current',
|
|
80
66
|
'profileCreate.copy': 'Copy from the source',
|
|
81
67
|
'profileCreate.settings': 'Settings (models, theme, …)',
|
|
82
|
-
'profileCreate.plugins': 'Local plugin files',
|
|
83
|
-
'profileCreate.pluginsRequired': 'Referenced by settings; copied together',
|
|
84
|
-
'profileCreate.projects': 'Project list',
|
|
85
|
-
'profileCreate.sessions': 'Chat history',
|
|
86
68
|
'profileCreate.create': 'Create',
|
|
87
69
|
'profileCreate.creating': 'Creating…',
|
|
88
70
|
'profileCreate.created': 'Created {profile}.',
|
|
@@ -94,7 +76,7 @@ export const enSettings: Record<keyof typeof zhSettings, string> = {
|
|
|
94
76
|
'profileCreate.failed': 'The workbench was not created; see the output below.',
|
|
95
77
|
|
|
96
78
|
'configSync.nav': 'Config sync',
|
|
97
|
-
'configSync.lead': 'Only
|
|
79
|
+
'configSync.lead': 'Only rows that change settings of plugins the workbench already has are copied. Rows that mount a new plugin are not; chats, projects and attachments are shared already. Use “New workbench” to create a full profile.',
|
|
98
80
|
'configSync.source': 'Source',
|
|
99
81
|
'configSync.sourceBroken': 'its config is unreadable',
|
|
100
82
|
'configSync.sourceRows': '{name}: {count} rows are new or different for the workbench',
|
|
@@ -104,15 +86,6 @@ export const enSettings: Record<keyof typeof zhSettings, string> = {
|
|
|
104
86
|
'configSync.readHint': 'Pick another source, or read again.',
|
|
105
87
|
'configSync.tag.new': 'New',
|
|
106
88
|
'configSync.tag.differs': 'Differs',
|
|
107
|
-
'configSync.tag.asset': 'File missing',
|
|
108
|
-
'configSync.tag.fileDiffers': 'File differs',
|
|
109
|
-
'configSync.assetOnly': 'The setting is the same; only its file is missing.',
|
|
110
|
-
'configSync.assetMissingOne': '1 file is still needed: {path}',
|
|
111
|
-
'configSync.assetMissingMany': '{count} files are still needed: {path}',
|
|
112
|
-
'configSync.assetDiffers': 'The file differs: {path}',
|
|
113
|
-
'configSync.assetDiffersMany': 'The files differ: {path} ({count} files)',
|
|
114
|
-
'configSync.assetExternal': 'This file cannot be copied: {path} ({reason})',
|
|
115
|
-
'configSync.assetOverwrite': 'Overwrite the workbench copy',
|
|
116
89
|
'configSync.conflictNote': 'Applying replaces this workbench copy with the source',
|
|
117
90
|
'configSync.code.lang': 'yaml',
|
|
118
91
|
'configSync.code.copy': 'Copy',
|
|
@@ -129,7 +102,6 @@ export const enSettings: Record<keyof typeof zhSettings, string> = {
|
|
|
129
102
|
'configSync.applying': 'Writing…',
|
|
130
103
|
'configSync.applied': 'Written and checked',
|
|
131
104
|
'configSync.appliedUnverified': 'Written; restart to check whether it took effect',
|
|
132
|
-
'configSync.appliedFiles': 'Copied {count} files',
|
|
133
105
|
'configSync.appliedIds': 'Written this time: {ids}',
|
|
134
106
|
'configSync.skippedIds': 'Left alone (already here): {ids}',
|
|
135
107
|
'configSync.nothing': 'Nothing to sync',
|
package/src/i18n/zh.ts
CHANGED
|
@@ -141,6 +141,7 @@ export const zh = {
|
|
|
141
141
|
'panels.market.selfUpdateFailed': '自更新没成:{reason}',
|
|
142
142
|
'panels.market.selfUpdateUnknown': '外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)',
|
|
143
143
|
'panels.market.selfUpdateRolledBack': '没换成,已回滚到 {version}。',
|
|
144
|
+
'panels.market.selfUpdateNeedsMigrate': '工作台已更新。旧会话 / 项目不会自动并:先退出所有 dsh,再运行 dsh-workbench migrate(--force 可补并)。',
|
|
144
145
|
'panels.market.uninstall': '卸载',
|
|
145
146
|
'panels.market.uninstallLabel': '卸载 {name}',
|
|
146
147
|
'panels.market.installing': '正在安装…',
|
|
@@ -375,7 +376,6 @@ export const zh = {
|
|
|
375
376
|
'panels.discover.tabOverview': '概览',
|
|
376
377
|
'panels.discover.tabReadme': '说明',
|
|
377
378
|
'panels.discover.tabChangelog': '更新日志',
|
|
378
|
-
'panels.discover.docTitle': '{version} 的{kind}',
|
|
379
379
|
'panels.discover.docReadme': '说明',
|
|
380
380
|
'panels.discover.docChangelog': '更新日志',
|
|
381
381
|
'panels.discover.docLoading': '正在读取…',
|
|
@@ -618,6 +618,8 @@ export const zh = {
|
|
|
618
618
|
'approval.publish.module': '模块',
|
|
619
619
|
'approval.publish.target': '目标',
|
|
620
620
|
'approval.publish.version': '版本',
|
|
621
|
+
'approval.publish.author': '作者',
|
|
622
|
+
'approval.publish.authorMissing': '未署名(提交用本机 git 身份)',
|
|
621
623
|
'approval.publish.registry': '源',
|
|
622
624
|
'approval.publish.repo': '仓库',
|
|
623
625
|
'approval.publish.branch': '分支',
|