@dsh-workbench/shared 1.1.0 → 1.1.2

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.
@@ -45,6 +45,8 @@ export interface MarketIndexVersion {
45
45
  readonly engines?: MarketIndexEngines;
46
46
  }
47
47
  export interface MarketIndexEntryMetadata {
48
+ readonly workbench?: boolean;
49
+ readonly unit?: string;
48
50
  readonly category?: string;
49
51
  readonly labels?: readonly string[];
50
52
  readonly keywords?: readonly string[];
@@ -55,11 +57,31 @@ export interface MarketIndexEntry {
55
57
  readonly title?: MarketLocalizedText;
56
58
  readonly description?: MarketLocalizedText;
57
59
  readonly author?: string;
60
+ readonly owner?: string;
58
61
  readonly homepage?: string;
59
62
  readonly icon?: string;
60
63
  readonly metadata?: MarketIndexEntryMetadata;
61
64
  readonly versions: readonly MarketIndexVersion[];
62
65
  }
66
+ export type MarketClaim = {
67
+ readonly state: 'new';
68
+ } | {
69
+ readonly state: 'owned';
70
+ readonly owner: string;
71
+ } | {
72
+ readonly state: 'unowned';
73
+ } | {
74
+ readonly state: 'conflict';
75
+ readonly owner: string;
76
+ } | {
77
+ readonly state: 'unit-taken';
78
+ readonly entry: string;
79
+ } | {
80
+ readonly state: 'path-taken';
81
+ readonly entry: string;
82
+ } | {
83
+ readonly state: 'unknown';
84
+ };
63
85
  export interface MarketIndexCategory {
64
86
  readonly title?: MarketLocalizedText;
65
87
  }
@@ -82,7 +104,7 @@ export interface MarketIndex {
82
104
  readonly metadata?: MarketIndexMetadata;
83
105
  readonly plugins: readonly MarketIndexEntry[];
84
106
  }
85
- export type MarketIndexProblemKind = 'not-json' | 'not-object' | 'format' | 'plugins' | 'plugin' | 'name' | 'duplicate-name' | 'versions' | 'version' | 'version-order' | 'source' | 'git-commit' | 'timestamp' | 'icon';
107
+ export type MarketIndexProblemKind = 'not-json' | 'not-object' | 'format' | 'plugins' | 'plugin' | 'name' | 'duplicate-name' | 'versions' | 'version' | 'version-order' | 'source' | 'git-commit' | 'timestamp' | 'icon' | 'owner' | 'unit';
86
108
  export interface MarketIndexProblem {
87
109
  readonly kind: MarketIndexProblemKind;
88
110
  readonly detail: string;
@@ -158,6 +180,7 @@ export interface PublishChangelog {
158
180
  readonly version: string;
159
181
  readonly text?: string;
160
182
  readonly missing?: boolean;
183
+ readonly pending?: boolean;
161
184
  }
162
185
  export interface PublishPreview {
163
186
  readonly name: string;
@@ -165,6 +188,7 @@ export interface PublishPreview {
165
188
  readonly author?: string;
166
189
  readonly registry?: string;
167
190
  readonly market?: MarketPublishDestination;
191
+ readonly claim?: MarketClaim;
168
192
  readonly changelog?: PublishChangelog;
169
193
  }
170
194
  export type DiscoverDocKind = 'readme' | 'changelog';
@@ -194,4 +218,8 @@ export type MarketSourcesAction = {
194
218
  readonly action: 'init';
195
219
  readonly id: string;
196
220
  readonly ref?: string;
221
+ readonly stampOnly?: boolean;
222
+ } | {
223
+ readonly action: 'read-only';
224
+ readonly id: string;
197
225
  };
@@ -228,12 +228,8 @@ export function readDeclaration(subject, raw) {
228
228
  manifest: {
229
229
  id,
230
230
  title: { zh: text(declaration.title.zh), en: text(declaration.title.en) },
231
- card: card === null
232
- ? null
233
- : {
234
- titleKey: unitTitleKey(id),
235
- order: card.order,
236
- },
231
+ titleKey: unitTitleKey(id),
232
+ card: card === null ? null : { order: card.order },
237
233
  tools: declaration.tools.map((tool) => ({
238
234
  name: text(tool.name),
239
235
  writes: tool.writes,
@@ -13,10 +13,9 @@ export interface UnitTitle {
13
13
  */
14
14
  export declare function unitTitleKey(unit: string): string;
15
15
  /**
16
- * 一张卡片在清单里的静态声明(文案键加排序位);默认显不显示由运行期面板配置定。
16
+ * 一张卡片在清单里的静态声明:只剩排序位;显不显示由运行期面板配置定。
17
17
  */
18
18
  export interface UnitCard {
19
- readonly titleKey: string;
20
19
  readonly order: number;
21
20
  }
22
21
  /**
@@ -41,11 +40,13 @@ export interface PluginRelease {
41
40
  readonly latest?: string;
42
41
  }
43
42
  /**
44
- * 装配期用的模块清单:单元 id、名字、卡片、工具、宿主服务与环境需要,比声明少一层协议包装。
43
+ * 装配期用的模块清单:单元 id、名字、名字键、卡片、工具、宿主服务与环境需要,比声明少一层协议包装。
44
+ * titleKey 恒等于 unitTitleKey(id):有没有卡片都指向同一个词表键,展示方照它取名字。
45
45
  */
46
46
  export interface UnitManifest {
47
47
  readonly id: string;
48
48
  readonly title?: UnitTitle;
49
+ readonly titleKey: string;
49
50
  readonly card: UnitCard | null;
50
51
  readonly tools: readonly UnitTool[];
51
52
  readonly host: UnitHostNeeds;
@@ -19,3 +19,10 @@ export declare function parseChangelog(text: string): readonly ChangelogSection[
19
19
  export declare function changelogSectionOf(text: string, version: string): string | undefined;
20
20
  export declare function changelogHasEntry(text: string, version: string): boolean;
21
21
  export declare function appendChangelogEntry(text: string, options: ChangelogEntryOptions): string;
22
+ export interface ChangelogPlan {
23
+ readonly action: 'kept' | 'written';
24
+ readonly version: string;
25
+ readonly text: string;
26
+ readonly section: string;
27
+ }
28
+ export declare function planChangelog(text: string, options: ChangelogEntryOptions): ChangelogPlan | undefined;
@@ -177,6 +177,18 @@ export function appendChangelogEntry(text, options) {
177
177
  out.splice(at, 0, ...bullets);
178
178
  return `${normalizeWhitespace(out)}\n`;
179
179
  }
180
+ export function planChangelog(text, options) {
181
+ const source = normalizeChangelogText(text);
182
+ const version = changelogVersion(options.version);
183
+ const section = changelogSectionOf(source, version);
184
+ if (section !== undefined && changelogHasEntry(source, version)) {
185
+ return { action: 'kept', version, text: source, section };
186
+ }
187
+ if (bulletsOf(options.note).length === 0)
188
+ return undefined;
189
+ const next = appendChangelogEntry(source, options);
190
+ return { action: 'written', version, text: next, section: changelogSectionOf(next, version) ?? '' };
191
+ }
180
192
  function normalizeWhitespace(rows) {
181
193
  const out = [];
182
194
  for (const row of rows) {
@@ -0,0 +1,18 @@
1
+ import type { MarketClaim, MarketIndex, MarketIndexEntry } from '../contract/protocol/market-index.js';
2
+ export interface PublisherIdentity {
3
+ readonly name: string;
4
+ readonly email?: string;
5
+ }
6
+ export declare function publisherIdentityOf(text: string | undefined): PublisherIdentity | undefined;
7
+ export declare function samePublisher(left: string, right: string): boolean;
8
+ export declare function entryOwnerOf(entry: MarketIndexEntry): string | undefined;
9
+ export declare function claimOfEntry(entry: MarketIndexEntry | undefined, publisher: string | undefined): MarketClaim;
10
+ export interface MarketClaimInput {
11
+ readonly name: string;
12
+ readonly publisher: string | undefined;
13
+ readonly unit?: string | undefined;
14
+ readonly artifactPath?: string | undefined;
15
+ }
16
+ export declare function marketArtifactPath(name: string): string;
17
+ export declare function entryUnitOf(entry: MarketIndexEntry): string | undefined;
18
+ export declare function claimOf(index: MarketIndex, input: MarketClaimInput): MarketClaim;
@@ -0,0 +1,83 @@
1
+ function foldedName(name) {
2
+ return name.replace(/\s+/gu, ' ').trim().toLowerCase();
3
+ }
4
+ export function publisherIdentityOf(text) {
5
+ const raw = (text ?? '').trim();
6
+ if (raw === '')
7
+ return undefined;
8
+ const match = /^(.*?)\s*<([^<>]*)>\s*$/u.exec(raw);
9
+ const name = (match === null ? raw : match[1]).trim();
10
+ const email = match === null ? '' : match[2].trim().toLowerCase();
11
+ if (name === '')
12
+ return undefined;
13
+ return email === '' ? { name } : { name, email };
14
+ }
15
+ export function samePublisher(left, right) {
16
+ const a = publisherIdentityOf(left);
17
+ const b = publisherIdentityOf(right);
18
+ if (a === undefined || b === undefined)
19
+ return false;
20
+ if (a.email !== undefined && b.email !== undefined)
21
+ return a.email === b.email;
22
+ return foldedName(a.name) === foldedName(b.name);
23
+ }
24
+ export function entryOwnerOf(entry) {
25
+ const owner = (entry.owner ?? '').trim();
26
+ if (owner !== '')
27
+ return owner;
28
+ const author = (entry.author ?? '').trim();
29
+ return author === '' ? undefined : author;
30
+ }
31
+ export function claimOfEntry(entry, publisher) {
32
+ if (entry === undefined)
33
+ return { state: 'new' };
34
+ const owner = entryOwnerOf(entry);
35
+ if (owner === undefined)
36
+ return { state: 'unowned' };
37
+ if (publisher === undefined || publisher.trim() === '')
38
+ return { state: 'unknown' };
39
+ return samePublisher(owner, publisher) ? { state: 'owned', owner } : { state: 'conflict', owner };
40
+ }
41
+ export function marketArtifactPath(name) {
42
+ return `packages/${name}`;
43
+ }
44
+ export function entryUnitOf(entry) {
45
+ const unit = entry.metadata?.unit?.trim();
46
+ if (unit !== undefined && unit !== '')
47
+ return unit;
48
+ for (const version of entry.versions) {
49
+ if (version.source.type !== 'git')
50
+ continue;
51
+ const match = /^packages\/([^/]+)$/u.exec(version.source.path ?? '');
52
+ const legacy = match?.[1];
53
+ if (legacy !== undefined)
54
+ return legacy;
55
+ }
56
+ return undefined;
57
+ }
58
+ export function claimOf(index, input) {
59
+ const base = claimOfEntry(index.plugins.find((one) => one.name === input.name), input.publisher);
60
+ if (base.state === 'conflict' || base.state === 'unknown')
61
+ return base;
62
+ const unit = (input.unit ?? '').trim();
63
+ if (unit !== '') {
64
+ for (const other of index.plugins) {
65
+ if (other.name === input.name)
66
+ continue;
67
+ if (entryUnitOf(other) !== unit)
68
+ continue;
69
+ return { state: 'unit-taken', entry: other.name };
70
+ }
71
+ }
72
+ const path = (input.artifactPath ?? '').trim();
73
+ if (path !== '') {
74
+ for (const other of index.plugins) {
75
+ if (other.name === input.name)
76
+ continue;
77
+ if (!other.versions.some((one) => one.source.type === 'git' && (one.source.path ?? '') === path))
78
+ continue;
79
+ return { state: 'path-taken', entry: other.name };
80
+ }
81
+ }
82
+ return base;
83
+ }
@@ -17,7 +17,10 @@ export const MARKET_INDEX_README_LINES = [
17
17
  'dsh-wb-module release --index <本仓库地址> --index-policy artifacts-in-repo',
18
18
  '```',
19
19
  '',
20
- '产物会提交到 `packages/<unit>/`,并更新 `market.json`。',
20
+ '产物会提交到 `packages/<包名>/`(带 scope 时是 `packages/@scope/名字/`),并更新 `market.json`。',
21
+ '',
22
+ '一个包名归第一次发布的人(`market.json` 里的 `owner`)。换一个署名发同名会被拒;要换人,先把这一条的 `owner` 改成新的人。',
23
+ '同一个市场里,一个模块 id(`metadata.unit`)只能被一个条目使用;另一个包名想用同一个 id / 产物目录也会被拒。',
21
24
  '',
22
25
  '## 使用这个索引',
23
26
  '',
@@ -137,10 +140,21 @@ function iconProblem(icon) {
137
140
  return undefined;
138
141
  return problem('icon', 'icon 只能是 base64 data URL 或 http(s) URL');
139
142
  }
143
+ const MAX_OWNER_CHARS = 200;
144
+ const UNIT_ID = /^[a-z][a-z0-9-]*$/;
145
+ function ownerProblem(owner) {
146
+ if (/[\r\n]/u.test(owner))
147
+ return problem('owner', 'owner 只能是一行署名');
148
+ if (owner.length > MAX_OWNER_CHARS)
149
+ return problem('owner', 'owner 超过 200 字');
150
+ return undefined;
151
+ }
140
152
  function metadataOf(raw) {
141
153
  const record = asRecord(raw);
142
154
  if (record === undefined)
143
155
  return undefined;
156
+ const workbench = record['workbench'] === true;
157
+ const unit = asText(record['unit']);
144
158
  const category = asText(record['category']);
145
159
  const labels = asTextArray(record['labels']);
146
160
  const keywords = asTextArray(record['keywords']);
@@ -149,6 +163,8 @@ function metadataOf(raw) {
149
163
  ? undefined
150
164
  : Object.fromEntries(Object.entries(sortKeysRecord).flatMap(([key, value]) => typeof value === 'string' || typeof value === 'number' ? [[key, value]] : []));
151
165
  return {
166
+ ...(workbench ? { workbench: true } : {}),
167
+ ...(unit === '' ? {} : { unit }),
152
168
  ...(category === '' ? {} : { category }),
153
169
  ...(labels.length === 0 ? {} : { labels }),
154
170
  ...(keywords.length === 0 ? {} : { keywords }),
@@ -175,14 +191,24 @@ function entryOf(raw, at) {
175
191
  const title = asLocalized(record['title']);
176
192
  const description = asLocalized(record['description']);
177
193
  const author = asText(record['author']);
194
+ const owner = asText(record['owner']);
195
+ if (owner !== '') {
196
+ const badOwner = ownerProblem(owner);
197
+ if (badOwner !== undefined)
198
+ return badOwner;
199
+ }
178
200
  const homepage = asText(record['homepage']);
179
201
  const metadata = metadataOf(record['metadata']);
202
+ if (metadata?.unit !== undefined && !UNIT_ID.test(metadata.unit)) {
203
+ return problem('unit', `metadata.unit 只能是小写字母开头的 a-z0-9-(现在是 ${JSON.stringify(metadata.unit)})`, at);
204
+ }
180
205
  return {
181
206
  name,
182
207
  versions,
183
208
  ...(title === undefined ? {} : { title }),
184
209
  ...(description === undefined ? {} : { description }),
185
210
  ...(author === '' ? {} : { author }),
211
+ ...(owner === '' ? {} : { owner }),
186
212
  ...(homepage === '' ? {} : { homepage }),
187
213
  ...(icon === '' ? {} : { icon }),
188
214
  ...(metadata === undefined ? {} : { metadata }),
@@ -259,8 +285,14 @@ export function upsertMarketEntry(index, entry) {
259
285
  merged.set(one.version, one);
260
286
  for (const one of entry.versions)
261
287
  merged.set(one.version, one);
288
+ const owner = current.owner ?? entry.owner;
262
289
  const plugins = [...index.plugins];
263
- plugins[found] = { ...current, ...entry, versions: sortMarketVersions([...merged.values()]) };
290
+ plugins[found] = {
291
+ ...current,
292
+ ...entry,
293
+ ...(owner === undefined ? {} : { owner }),
294
+ versions: sortMarketVersions([...merged.values()]),
295
+ };
264
296
  return { ...index, plugins };
265
297
  }
266
298
  export function marketEntryLabels(entry) {
package/dist/host.d.ts CHANGED
@@ -72,4 +72,5 @@ export * from './host/extension.js';
72
72
  export * from './host/port-types.js';
73
73
  export * from './host/version-range.js';
74
74
  export * from './host/market-index.js';
75
+ export * from './host/market-index-claim.js';
75
76
  export * from './host/changelog.js';
package/dist/host.js CHANGED
@@ -72,4 +72,5 @@ export * from './host/extension.js';
72
72
  export * from './host/port-types.js';
73
73
  export * from './host/version-range.js';
74
74
  export * from './host/market-index.js';
75
+ export * from './host/market-index-claim.js';
75
76
  export * from './host/changelog.js';
package/dist/i18n/en.js CHANGED
@@ -289,12 +289,19 @@ export const en = {
289
289
  'panels.discover.addingSource': 'Adding…',
290
290
  'panels.discover.addFirstSource': 'Add index source',
291
291
  'panels.discover.removeSource': 'Remove',
292
- 'panels.discover.removeSourceNamed': 'Remove {url}',
293
- 'panels.discover.useSource': 'Use',
294
- 'panels.discover.useSourceNamed': 'Use {label}',
295
- 'panels.discover.sourceCurrent': 'In use',
292
+ 'panels.discover.removeTitle': 'Remove this index source?',
293
+ 'panels.discover.removeBody': '"{label}" will be removed from this list; the repository itself is not deleted, and you can add it back later.',
294
+ 'panels.discover.sourceActions': 'Actions for {label}',
295
+ 'panels.discover.sourceStateWritable': 'Publish target',
296
+ 'panels.discover.sourceStateReadOnly': 'Read-only list',
297
+ 'panels.discover.sourceEnable': 'Set up for publishing',
298
+ 'panels.discover.sourceDisable': 'Set to read-only',
299
+ 'panels.discover.sourceWorking': 'Updating…',
300
+ 'panels.discover.sourceEnabled': '"{label}" is ready for publishing',
301
+ 'panels.discover.sourceReadOnly': '"{label}" is now read-only',
296
302
  'panels.discover.refresh': 'Refresh',
297
303
  'panels.discover.search': 'Search modules',
304
+ 'panels.discover.clearSearch': 'Clear search',
298
305
  'panels.discover.all': 'All',
299
306
  'panels.discover.sourceLabel': 'Name',
300
307
  'panels.discover.sourceKind': 'Type',
@@ -318,7 +325,7 @@ export const en = {
318
325
  'panels.discover.missingIndex': 'This repository has no {path} yet.',
319
326
  'panels.discover.initTitle': 'Initialize this repository as a module market index?',
320
327
  'panels.discover.initCta': 'Initialize market index',
321
- 'panels.discover.initWhat': 'It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under packages/<unit>/. The repository stays owned by its owner.',
328
+ 'panels.discover.initWhat': 'It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under packages/<package-name>/. The repository stays owned by its owner.',
322
329
  'panels.discover.initBranch': 'Branch',
323
330
  'panels.discover.initBranchHint': 'The index and build files go to this branch; an empty repository gets it created.',
324
331
  'panels.discover.initBranchBad': 'Use only letters, digits, dots, underscores, slashes, or dashes in a branch name.',
@@ -628,6 +635,13 @@ export const en = {
628
635
  'approval.publish.version': 'Version',
629
636
  'approval.publish.author': 'Author',
630
637
  'approval.publish.authorMissing': 'unsigned',
638
+ 'approval.publish.owner': 'Owner',
639
+ 'approval.publish.ownerUnowned': 'originally unattributed',
640
+ 'approval.publish.ownerTaken': 'Owned by {owner}',
641
+ 'approval.publish.unit': 'Module id',
642
+ 'approval.publish.unitTaken': 'Taken by {entry}',
643
+ 'approval.publish.path': 'Artifact dir',
644
+ 'approval.publish.pathTaken': 'Taken by {entry}',
631
645
  'approval.publish.registry': 'Registry',
632
646
  'approval.publish.repo': 'Repository',
633
647
  'approval.publish.branch': 'Branch',
@@ -638,6 +652,7 @@ export const en = {
638
652
  'approval.publish.twoCommits': 'build files + market.json in 2 commits, one push',
639
653
  'approval.publish.reading': 'Reading…',
640
654
  'approval.publish.changelog': 'Changelog for {version}',
655
+ 'approval.publish.changelogPending': 'This release writes the {version} changelog entry',
641
656
  'approval.publish.changelogMissing': 'No changelog entry for {version}; publishing will be blocked',
642
657
  'approval.publish.targetAuto': 'configured default',
643
658
  'approval.publish.targetTeam': 'team registry',
@@ -646,6 +661,15 @@ export const en = {
646
661
  'approval.publish.targetGit': 'git repository',
647
662
  'approval.publish.targetMarket': 'module market index',
648
663
  'approval.publish.targetLocal': 'keep local',
664
+ 'approval.market.source': 'Index source',
665
+ 'approval.market.url': 'URL',
666
+ 'approval.market.action': 'This action',
667
+ 'approval.market.policy': 'Current state',
668
+ 'approval.market.enable': 'make it publishable',
669
+ 'approval.market.disable': 'make it read-only',
670
+ 'approval.market.writable': 'publishable',
671
+ 'approval.market.readOnly': 'read-only module list',
672
+ 'approval.market.reading': 'Reading…',
649
673
  'markdown.copy': 'Copy',
650
674
  'markdown.copied': 'Copied',
651
675
  'markdown.footnotes': 'Footnotes',
@@ -299,12 +299,19 @@ export declare const dictionaries: {
299
299
  readonly 'panels.discover.addingSource': "正在添加…";
300
300
  readonly 'panels.discover.addFirstSource': "添加索引源";
301
301
  readonly 'panels.discover.removeSource': "移除";
302
- readonly 'panels.discover.removeSourceNamed': "移除 {url}";
303
- readonly 'panels.discover.useSource': "使用";
304
- readonly 'panels.discover.useSourceNamed': "使用 {label}";
305
- readonly 'panels.discover.sourceCurrent': "当前使用";
302
+ readonly 'panels.discover.removeTitle': "移除这个索引源?";
303
+ readonly 'panels.discover.removeBody': "会把「{label}」从这份列表里移除;仓库本身不会被删,之后还能再添加。";
304
+ readonly 'panels.discover.sourceActions': "「{label}」的操作";
305
+ readonly 'panels.discover.sourceStateWritable': "可发布";
306
+ readonly 'panels.discover.sourceStateReadOnly': "仅读取模块列表";
307
+ readonly 'panels.discover.sourceEnable': "设为可发布";
308
+ readonly 'panels.discover.sourceDisable': "设为只读";
309
+ readonly 'panels.discover.sourceWorking': "设置中…";
310
+ readonly 'panels.discover.sourceEnabled': "已把「{label}」设为可发布";
311
+ readonly 'panels.discover.sourceReadOnly': "已把「{label}」设为只读";
306
312
  readonly 'panels.discover.refresh': "刷新";
307
313
  readonly 'panels.discover.search': "搜索模块";
314
+ readonly 'panels.discover.clearSearch': "清除搜索";
308
315
  readonly 'panels.discover.all': "全部";
309
316
  readonly 'panels.discover.sourceLabel': "名字";
310
317
  readonly 'panels.discover.sourceKind': "类型";
@@ -328,7 +335,7 @@ export declare const dictionaries: {
328
335
  readonly 'panels.discover.missingIndex': "仓库里还没有索引文件 {path}";
329
336
  readonly 'panels.discover.initTitle': "把这个仓库初始化成模块市场索引?";
330
337
  readonly 'panels.discover.initCta': "初始化成市场索引";
331
- readonly 'panels.discover.initWhat': "会在 {branch} 分支写 market.json 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 packages/<unit>/。仓库的写权限归它的所有者。";
338
+ readonly 'panels.discover.initWhat': "会在 {branch} 分支写 market.json 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到按包名分的 packages/<包名>/。仓库的写权限归它的所有者。";
332
339
  readonly 'panels.discover.initBranch': "分支";
333
340
  readonly 'panels.discover.initBranchHint': "索引和打包文件都发到这个分支;空仓库会新建它。";
334
341
  readonly 'panels.discover.initBranchBad': "分支名只能用字母、数字、点、下划线、斜杠或短横线";
@@ -638,6 +645,13 @@ export declare const dictionaries: {
638
645
  readonly 'approval.publish.version': "版本";
639
646
  readonly 'approval.publish.author': "作者";
640
647
  readonly 'approval.publish.authorMissing': "未署名";
648
+ readonly 'approval.publish.owner': "认领人";
649
+ readonly 'approval.publish.ownerUnowned': "原来没署名";
650
+ readonly 'approval.publish.ownerTaken': "已有主人:{owner}";
651
+ readonly 'approval.publish.unit': "模块 id";
652
+ readonly 'approval.publish.unitTaken': "已被 {entry} 占用";
653
+ readonly 'approval.publish.path': "产物目录";
654
+ readonly 'approval.publish.pathTaken': "已被 {entry} 占用";
641
655
  readonly 'approval.publish.registry': "源";
642
656
  readonly 'approval.publish.repo': "仓库";
643
657
  readonly 'approval.publish.branch': "分支";
@@ -648,6 +662,7 @@ export declare const dictionaries: {
648
662
  readonly 'approval.publish.twoCommits': "打包文件 + market.json 两次提交,一次推送";
649
663
  readonly 'approval.publish.reading': "读取中…";
650
664
  readonly 'approval.publish.changelog': "{version} 的更新日志";
665
+ readonly 'approval.publish.changelogPending': "{version} 这一版会写进更新日志,随包发布";
651
666
  readonly 'approval.publish.changelogMissing': "这一版还没有更新日志({version}),发布会被拦下";
652
667
  readonly 'approval.publish.targetAuto': "按配置默认";
653
668
  readonly 'approval.publish.targetTeam': "团队源";
@@ -656,6 +671,15 @@ export declare const dictionaries: {
656
671
  readonly 'approval.publish.targetGit': "git 仓库";
657
672
  readonly 'approval.publish.targetMarket': "模块市场索引";
658
673
  readonly 'approval.publish.targetLocal': "留在本机";
674
+ readonly 'approval.market.source': "索引源";
675
+ readonly 'approval.market.url': "地址";
676
+ readonly 'approval.market.action': "这次操作";
677
+ readonly 'approval.market.policy': "当前状态";
678
+ readonly 'approval.market.enable': "设为可发布";
679
+ readonly 'approval.market.disable': "改回只读";
680
+ readonly 'approval.market.writable': "可发布";
681
+ readonly 'approval.market.readOnly': "仅读取模块列表";
682
+ readonly 'approval.market.reading': "正在读取…";
659
683
  readonly 'markdown.copy': "复制";
660
684
  readonly 'markdown.copied': "已复制";
661
685
  readonly 'markdown.footnotes': "脚注";
@@ -711,7 +735,7 @@ export declare const dictionaries: {
711
735
  readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
712
736
  readonly 'configSync.failed': "同步没成功,再试一次。";
713
737
  };
714
- en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeSourceNamed" | "panels.discover.useSource" | "panels.discover.useSourceNamed" | "panels.discover.sourceCurrent" | "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>;
738
+ en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeTitle" | "panels.discover.removeBody" | "panels.discover.sourceActions" | "panels.discover.sourceStateWritable" | "panels.discover.sourceStateReadOnly" | "panels.discover.sourceEnable" | "panels.discover.sourceDisable" | "panels.discover.sourceWorking" | "panels.discover.sourceEnabled" | "panels.discover.sourceReadOnly" | "panels.discover.refresh" | "panels.discover.search" | "panels.discover.clearSearch" | "panels.discover.all" | "panels.discover.sourceLabel" | "panels.discover.sourceKind" | "panels.discover.sourceKindHttp" | "panels.discover.sourceKindGit" | "panels.discover.sourceUrl" | "panels.discover.sourcePlaceholder" | "panels.discover.sourceRef" | "panels.discover.sourcePath" | "panels.discover.sourceLocal" | "panels.discover.sourceLocalHint" | "panels.discover.save" | "panels.discover.cancel" | "panels.discover.retry" | "panels.discover.noSource" | "panels.discover.noSourceHint" | "panels.discover.sourcesFailed" | "panels.discover.unreadable" | "panels.discover.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.owner" | "approval.publish.ownerUnowned" | "approval.publish.ownerTaken" | "approval.publish.unit" | "approval.publish.unitTaken" | "approval.publish.path" | "approval.publish.pathTaken" | "approval.publish.registry" | "approval.publish.repo" | "approval.publish.branch" | "approval.publish.defaultBranch" | "approval.publish.artifacts" | "approval.publish.index" | "approval.publish.commits" | "approval.publish.twoCommits" | "approval.publish.reading" | "approval.publish.changelog" | "approval.publish.changelogPending" | "approval.publish.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "approval.market.source" | "approval.market.url" | "approval.market.action" | "approval.market.policy" | "approval.market.enable" | "approval.market.disable" | "approval.market.writable" | "approval.market.readOnly" | "approval.market.reading" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
715
739
  };
716
740
  /** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
717
741
  export type { WorkbenchMessages };