@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.
@@ -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' | 'same';
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;
@@ -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
- import { quoteShellArg, tailLines } from '../host/shell-text.js';
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',
@@ -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 };
@@ -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
  /** 上面那组的中文对照。 */
@@ -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 setting rows and the local files they reference are copied; project lists and sessions are not. Use “New workbench” to create a full profile.',
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,3 @@
1
+ import type { DshShell } from '../api/dsh.js';
2
+ import type { GitReader } from '../contract/git.js';
3
+ export declare function createFakeGit(shell: DshShell): GitReader;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/shared",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.1",
4
4
  "description": "工作台与模块共享的纯代码与契约类型:类型、纯逻辑、哑组件、平台解析。宿主侧的东西从 /host 进(不影响浏览器产物)。",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -80,6 +80,7 @@ export interface WorkbenchSelfUpdate {
80
80
  readonly version?: string;
81
81
  readonly at?: string;
82
82
  readonly tail?: string;
83
+ readonly migration?: 'needed';
83
84
  }
84
85
 
85
86
  export const RESTART_REASONS = [
@@ -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' | 'same';
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;
@@ -15,9 +15,6 @@ export interface ProfileCreateSnapshot {
15
15
 
16
16
  export interface ProfileCreateCopy {
17
17
  readonly settings: boolean;
18
- readonly plugins: boolean;
19
- readonly projects: boolean;
20
- readonly sessions: boolean;
21
18
  }
22
19
 
23
20
  export interface ProfileCreateRequest {
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',
@@ -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 setting rows and the local files they reference are copied; project lists and sessions are not. Use “New workbench” to create a full profile.',
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': '分支',