@dsh-workbench/shared 1.0.0-beta.0 → 1.0.0-beta.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.
Files changed (70) hide show
  1. package/dist/components/FormNodes.js +5 -1
  2. package/dist/components/FormRows.css +1 -0
  3. package/dist/components/FormRows.d.ts +4 -2
  4. package/dist/components/FormRows.js +5 -4
  5. package/dist/config/constants.d.ts +0 -2
  6. package/dist/config/constants.js +0 -5
  7. package/dist/contract/command.d.ts +22 -0
  8. package/dist/contract/command.js +1 -0
  9. package/dist/contract/data.d.ts +2 -1
  10. package/dist/contract/extension.d.ts +14 -0
  11. package/dist/contract/extension.js +1 -0
  12. package/dist/contract/git.d.ts +38 -0
  13. package/dist/contract/git.js +1 -0
  14. package/dist/contract/lib.d.ts +4 -0
  15. package/dist/contract/lib.js +1 -0
  16. package/dist/host/adapter-set.js +1 -0
  17. package/dist/host/adapters.d.ts +6 -0
  18. package/dist/host/extension.d.ts +7 -0
  19. package/dist/host/extension.js +39 -0
  20. package/dist/host/git.d.ts +2 -33
  21. package/dist/host/http.js +1 -1
  22. package/dist/host/market-index.js +3 -44
  23. package/dist/host/port-types.d.ts +1 -0
  24. package/dist/host/release-packages.generated.d.ts +1 -0
  25. package/dist/host/release-packages.generated.js +10 -0
  26. package/dist/host/tool-kit.d.ts +0 -6
  27. package/dist/host/tool-kit.js +0 -22
  28. package/dist/host/unit-face.d.ts +7 -0
  29. package/dist/host/version-range.js +7 -67
  30. package/dist/host/version.d.ts +3 -2
  31. package/dist/host/version.js +17 -19
  32. package/dist/host.d.ts +6 -0
  33. package/dist/host.js +6 -0
  34. package/dist/i18n/en.js +1 -0
  35. package/dist/i18n/index.d.ts +2 -1
  36. package/dist/i18n/zh.d.ts +1 -0
  37. package/dist/i18n/zh.js +1 -0
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.js +4 -0
  40. package/dist/lib/version.d.ts +4 -0
  41. package/dist/lib/version.js +21 -0
  42. package/package.json +6 -4
  43. package/src/components/Form.test.tsx +6 -0
  44. package/src/components/FormNodes.tsx +6 -1
  45. package/src/components/FormRows.css +1 -0
  46. package/src/components/FormRows.test.tsx +30 -0
  47. package/src/components/FormRows.tsx +9 -5
  48. package/src/config/constants.ts +0 -6
  49. package/src/contract/command.ts +25 -0
  50. package/src/contract/data.ts +2 -1
  51. package/src/contract/extension.ts +20 -0
  52. package/src/contract/git.ts +20 -0
  53. package/src/contract/lib.ts +5 -0
  54. package/src/host/adapter-set.ts +1 -0
  55. package/src/host/adapters.ts +6 -0
  56. package/src/host/extension.test.ts +55 -0
  57. package/src/host/extension.ts +57 -0
  58. package/src/host/git.ts +6 -14
  59. package/src/host/http.ts +1 -1
  60. package/src/host/market-index.ts +3 -33
  61. package/src/host/port-types.ts +1 -0
  62. package/src/host/release-packages.generated.ts +10 -0
  63. package/src/host/tool-kit.ts +0 -35
  64. package/src/host/unit-face.ts +7 -0
  65. package/src/host/version-range.ts +6 -64
  66. package/src/host/version.ts +18 -18
  67. package/src/host.ts +6 -0
  68. package/src/i18n/en.ts +1 -0
  69. package/src/i18n/zh.ts +1 -0
  70. package/src/index.ts +4 -0
package/dist/host.d.ts CHANGED
@@ -3,6 +3,10 @@ export * from './api/context-ref.js';
3
3
  export * from './contract/unit.js';
4
4
  export * from './contract/needs.js';
5
5
  export * from './contract/data.js';
6
+ export * from './contract/extension.js';
7
+ export * from './contract/lib.js';
8
+ export * from './contract/git.js';
9
+ export * from './contract/command.js';
6
10
  export * from './contract/unit-board.js';
7
11
  export * from './contract/workbench-contract.js';
8
12
  export * from './contract/blocker.js';
@@ -41,6 +45,7 @@ export * from './host/provision.js';
41
45
  export * from './host/channel-plugin.js';
42
46
  export * from './host/recipe.js';
43
47
  export * from './host/recipe-rules.js';
48
+ export * from './host/release-packages.generated.js';
44
49
  export * from './contract/unit-capability.js';
45
50
  export * from './contract/plugin-source.js';
46
51
  export * from './contract/cli.js';
@@ -63,6 +68,7 @@ export * from './host/patch.js';
63
68
  export * from './host/adapters.js';
64
69
  export * from './host/adapter-set.js';
65
70
  export * from './host/needs.js';
71
+ export * from './host/extension.js';
66
72
  export * from './host/port-types.js';
67
73
  export * from './host/version-range.js';
68
74
  export * from './host/market-index.js';
package/dist/host.js CHANGED
@@ -3,6 +3,10 @@ export * from './api/context-ref.js';
3
3
  export * from './contract/unit.js';
4
4
  export * from './contract/needs.js';
5
5
  export * from './contract/data.js';
6
+ export * from './contract/extension.js';
7
+ export * from './contract/lib.js';
8
+ export * from './contract/git.js';
9
+ export * from './contract/command.js';
6
10
  export * from './contract/unit-board.js';
7
11
  export * from './contract/workbench-contract.js';
8
12
  export * from './contract/blocker.js';
@@ -41,6 +45,7 @@ export * from './host/provision.js';
41
45
  export * from './host/channel-plugin.js';
42
46
  export * from './host/recipe.js';
43
47
  export * from './host/recipe-rules.js';
48
+ export * from './host/release-packages.generated.js';
44
49
  export * from './contract/unit-capability.js';
45
50
  export * from './contract/plugin-source.js';
46
51
  export * from './contract/cli.js';
@@ -63,6 +68,7 @@ export * from './host/patch.js';
63
68
  export * from './host/adapters.js';
64
69
  export * from './host/adapter-set.js';
65
70
  export * from './host/needs.js';
71
+ export * from './host/extension.js';
66
72
  export * from './host/port-types.js';
67
73
  export * from './host/version-range.js';
68
74
  export * from './host/market-index.js';
package/dist/i18n/en.js CHANGED
@@ -267,6 +267,7 @@ export const en = {
267
267
  'panels.discover.loading': 'Reading the index',
268
268
  'panels.discover.lead': 'Browse modules from an index source; install and go.',
269
269
  'panels.discover.addSource': 'Add',
270
+ 'panels.discover.addingSource': 'Adding…',
270
271
  'panels.discover.addFirstSource': 'Add index source',
271
272
  'panels.discover.removeSource': 'Remove',
272
273
  'panels.discover.removeSourceNamed': 'Remove {url}',
@@ -277,6 +277,7 @@ export declare const dictionaries: {
277
277
  readonly 'panels.discover.loading': "正在读取索引";
278
278
  readonly 'panels.discover.lead': "从索引源浏览模块;装上就能用。";
279
279
  readonly 'panels.discover.addSource': "添加";
280
+ readonly 'panels.discover.addingSource': "正在添加…";
280
281
  readonly 'panels.discover.addFirstSource': "添加索引源";
281
282
  readonly 'panels.discover.removeSource': "移除";
282
283
  readonly 'panels.discover.removeSourceNamed': "移除 {url}";
@@ -701,7 +702,7 @@ export declare const dictionaries: {
701
702
  readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行搬过来,或自己去「模型」里配。";
702
703
  readonly 'configSync.failed': "同步没成功,再试一次。";
703
704
  };
704
- 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.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>;
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>;
705
706
  };
706
707
  /** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
707
708
  export type { WorkbenchMessages };
package/dist/i18n/zh.d.ts CHANGED
@@ -275,6 +275,7 @@ export declare const zh: {
275
275
  readonly 'panels.discover.loading': "正在读取索引";
276
276
  readonly 'panels.discover.lead': "从索引源浏览模块;装上就能用。";
277
277
  readonly 'panels.discover.addSource': "添加";
278
+ readonly 'panels.discover.addingSource': "正在添加…";
278
279
  readonly 'panels.discover.addFirstSource': "添加索引源";
279
280
  readonly 'panels.discover.removeSource': "移除";
280
281
  readonly 'panels.discover.removeSourceNamed': "移除 {url}";
package/dist/i18n/zh.js CHANGED
@@ -267,6 +267,7 @@ export const zh = {
267
267
  'panels.discover.loading': '正在读取索引',
268
268
  'panels.discover.lead': '从索引源浏览模块;装上就能用。',
269
269
  'panels.discover.addSource': '添加',
270
+ 'panels.discover.addingSource': '正在添加…',
270
271
  'panels.discover.addFirstSource': '添加索引源',
271
272
  'panels.discover.removeSource': '移除',
272
273
  'panels.discover.removeSourceNamed': '移除 {url}',
package/dist/index.d.ts CHANGED
@@ -37,6 +37,10 @@ export * from './config/constants.js';
37
37
  export * from './config/storage.js';
38
38
  export * from './contract/blocker.js';
39
39
  export * from './contract/data.js';
40
+ export * from './contract/extension.js';
41
+ export * from './contract/lib.js';
42
+ export * from './contract/git.js';
43
+ export * from './contract/command.js';
40
44
  export * from './contract/facts.js';
41
45
  export * from './contract/long-task.js';
42
46
  export * from './contract/protocol/bundle-install.js';
package/dist/index.js CHANGED
@@ -37,6 +37,10 @@ export * from './config/constants.js';
37
37
  export * from './config/storage.js';
38
38
  export * from './contract/blocker.js';
39
39
  export * from './contract/data.js';
40
+ export * from './contract/extension.js';
41
+ export * from './contract/lib.js';
42
+ export * from './contract/git.js';
43
+ export * from './contract/command.js';
40
44
  export * from './contract/facts.js';
41
45
  export * from './contract/long-task.js';
42
46
  export * from './contract/protocol/bundle-install.js';
@@ -0,0 +1,4 @@
1
+ export declare function isValidVersion(value: string): boolean;
2
+ export declare function isPrereleaseVersion(value: string): boolean;
3
+ export declare function compareVersions(left: string, right: string): number | undefined;
4
+ export declare function isNewerVersion(latest: string, installed: string): boolean;
@@ -0,0 +1,21 @@
1
+ import semver from 'semver';
2
+ export function isValidVersion(value) {
3
+ return semver.valid(value.trim()) !== null;
4
+ }
5
+ export function isPrereleaseVersion(value) {
6
+ const parsed = semver.valid(value.trim());
7
+ return parsed !== null && semver.prerelease(parsed) !== null;
8
+ }
9
+ export function compareVersions(left, right) {
10
+ const a = semver.valid(left.trim());
11
+ const b = semver.valid(right.trim());
12
+ if (a === null || b === null)
13
+ return undefined;
14
+ return semver.compare(a, b);
15
+ }
16
+ export function isNewerVersion(latest, installed) {
17
+ if (latest === installed)
18
+ return false;
19
+ const compared = compareVersions(latest, installed);
20
+ return compared === undefined ? true : compared > 0;
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/shared",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0-beta.1",
4
4
  "description": "工作台与模块共享的纯代码与契约类型:类型、纯逻辑、哑组件、平台解析。宿主侧的东西从 /host 进(不影响浏览器产物)。",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,13 +37,15 @@
37
37
  "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.2",
38
38
  "@types/node": "^24.19.0",
39
39
  "@types/react": "^19.0.0",
40
+ "@types/semver": "^7.8.0",
40
41
  "@vitest/coverage-v8": "^5.0.2",
41
42
  "react": "^18.0.0",
42
43
  "typescript": "5.9",
43
44
  "vitest": "^5.0.2"
44
45
  },
45
46
  "dependencies": {
46
- "dayjs": "^1.11.23"
47
+ "dayjs": "^1.11.23",
48
+ "semver": "^7.8.5"
47
49
  },
48
50
  "repository": {
49
51
  "type": "git",
@@ -55,12 +57,12 @@
55
57
  "url": "https://github.com/novaeth/dsh-workbench/issues"
56
58
  },
57
59
  "scripts": {
58
- "build": "tsc -p tsconfig.build.json && node scripts/copy-css.mjs",
60
+ "build": "node scripts/gen-release-packages.mjs && tsc -p tsconfig.build.json && node scripts/copy-css.mjs",
59
61
  "typecheck": "tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/tsconfig.tsbuildinfo",
60
62
  "test": "vitest run",
61
63
  "coverage": "vitest run --coverage",
62
64
  "barrels": "node scripts/barrels.mjs",
63
- "selfcheck": "node scripts/check-state.mjs",
65
+ "selfcheck": "node scripts/check-state.mjs && node scripts/gen-release-packages.mjs --check",
64
66
  "arch:report": "arch-guard --report-only",
65
67
  "arch": "arch-guard"
66
68
  }
@@ -403,6 +403,12 @@ describe('formRowsOf', () => {
403
403
  expect(propsOf(rows[0])['children']).toBe('env:wb-form-env:true:false');
404
404
  });
405
405
 
406
+ it('★ 标签挂到同一格的控件上(htmlFor 与绑定 id 同一个值)', () => {
407
+ const rows = formRowsOf({ fields: [field('env', 'prod')], problems, showProblem: true, busy: false });
408
+
409
+ expect(propsOf(rows[0])['htmlFor']).toBe('wb-form-env');
410
+ });
411
+
406
412
  it('★ 这一格的 value / onChange 从字段配置原样进绑定(值只写一处)', () => {
407
413
  const onChange = (): void => {};
408
414
  const probe: FormField = {
@@ -193,6 +193,7 @@ export function formRowsOf<Values extends object>(args: {
193
193
  h(FormRow, {
194
194
  key: field.key,
195
195
  label: field.label,
196
+ htmlFor: controlIdOf(field.key),
196
197
  hint: field.hint,
197
198
  problem: args.showProblem ? args.problems[field.key] : undefined,
198
199
  layout: field.layout,
@@ -200,6 +201,10 @@ export function formRowsOf<Values extends object>(args: {
200
201
  );
201
202
  }
202
203
 
204
+ function controlIdOf(key: string): string {
205
+ return `wb-form-${key}`;
206
+ }
207
+
203
208
  function controlOf<K extends string, V, Vals extends object>(
204
209
  field: FormField<K, V, Vals>,
205
210
  problems: Readonly<Record<string, ReactNode | undefined>>,
@@ -207,7 +212,7 @@ function controlOf<K extends string, V, Vals extends object>(
207
212
  busy: boolean,
208
213
  ): ReactNode {
209
214
  return field.control({
210
- id: `wb-form-${field.key}`,
215
+ id: controlIdOf(field.key),
211
216
  name: field.key,
212
217
  invalid: showProblem && Boolean(problems[field.key]),
213
218
  disabled: busy || field.disabled === true,
@@ -29,6 +29,7 @@
29
29
  }
30
30
 
31
31
  .wb-formLabel {
32
+ justify-self: start;
32
33
  min-width: 0;
33
34
  font-size: var(--dsw-font-xs-13-font-size);
34
35
  color: var(--dsw-alias-label-secondary);
@@ -48,6 +48,35 @@ describe('FormRow', () => {
48
48
  expect(childrenOf(node).filter((one) => one !== null)).toHaveLength(2);
49
49
  });
50
50
 
51
+ it('★ 行是 <div>,<label> 只包标签文字 —— 控件、提示与整行空白都不在标签里', () => {
52
+ const node = FormRow({
53
+ label: '项目',
54
+ htmlFor: 'wb-form-project',
55
+ hint: '选错了也能改',
56
+ children: '下拉',
57
+ }) as unknown as { type: unknown; props: { children: unknown[] } };
58
+ const [labelNode, controlNode, hintNode] = node.props.children as {
59
+ type: unknown;
60
+ props: Record<string, unknown>;
61
+ }[];
62
+
63
+ expect(node.type).toBe('div');
64
+ expect(labelNode?.type).toBe('label');
65
+ expect(labelNode?.props['htmlFor']).toBe('wb-form-project');
66
+ expect(texts(labelNode)).toEqual(['项目']);
67
+ expect(controlNode?.props['className']).toBe('wb-formControl');
68
+ expect(hintNode?.props['className']).toBe('wb-formHint');
69
+ });
70
+
71
+ it('没给 htmlFor 就不挂 for(排布照旧,只是点标签不聚焦)', () => {
72
+ const node = FormRow({ label: '项目', children: '下拉' }) as unknown as {
73
+ props: { children: unknown[] };
74
+ };
75
+ const labelNode = node.props.children[0] as { props: Record<string, unknown> };
76
+
77
+ expect(labelNode.props['htmlFor']).toBeUndefined();
78
+ });
79
+
51
80
  it('有 problem 就顶掉 hint(同一格,二选一),错误行挂 data-wb-problem 给聚焦那件找', () => {
52
81
  const node = FormRow({
53
82
  label: '项目',
@@ -150,6 +179,7 @@ describe('标签列:同一个 FormRows 共用一列(ADR-0052 §11)', () =>
150
179
 
151
180
  it('★ 标签不折行;stacked 还是单列、标签照常换行', () => {
152
181
  expect(declarations('.wb-formLabel')).toContain('white-space: nowrap');
182
+ expect(declarations('.wb-formLabel')).toContain('justify-self: start');
153
183
  expect(declarations(".wb-formRow[data-layout='stacked'] .wb-formLabel")).toContain(
154
184
  'white-space: normal',
155
185
  );
@@ -23,6 +23,7 @@ export function FormRows({ children }: FormRowsProps) {
23
23
  */
24
24
  export interface FormRowProps {
25
25
  readonly label: ReactNode;
26
+ readonly htmlFor?: string | undefined;
26
27
  readonly hint?: ReactNode | undefined;
27
28
  readonly problem?: ReactNode | undefined;
28
29
  readonly layout?: 'inline' | 'stacked' | undefined;
@@ -32,20 +33,23 @@ export interface FormRowProps {
32
33
  /**
33
34
  * 表单一行:左边标签、右边控件,提示与错误占控件下面那一格。
34
35
  * @param props.label - 这一行的标签;进了这一行,控件自己就别再给 `label`,否则会多一个标签。
36
+ * @param props.htmlFor - 标签挂到哪个控件(同一个 `id`);不给就只是排布,点标签不聚焦 —— `Form` 会自己接好。
35
37
  * @param props.hint - 控件下的说明;给了 `problem` 就不画它 —— 同一格不叠两段话。
36
38
  * @param props.problem - 校验失败那句话;给了就顶掉 `hint` 并给整行加上出错标记。
37
39
  * @param props.layout - `stacked` 才是标签在上、控件在下(默认 `inline`:标签在左)。
38
40
  * @param props.children - 控件本体。
39
- * @returns 一个 `<label>`。
41
+ * @returns 一个 `<div>`:里面的 `<label>` 只包标签文字,不包控件、提示与整行的空白。
40
42
  */
41
- export function FormRow({ label, hint, problem, layout = 'inline', children }: FormRowProps) {
43
+ export function FormRow({ label, htmlFor, hint, problem, layout = 'inline', children }: FormRowProps) {
42
44
  return (
43
- <label
45
+ <div
44
46
  className="wb-formRow"
45
47
  data-layout={layout}
46
48
  data-wb-problem={problem === undefined ? undefined : ''}
47
49
  >
48
- <span className="wb-formLabel">{label}</span>
50
+ <label className="wb-formLabel" htmlFor={htmlFor}>
51
+ {label}
52
+ </label>
49
53
  <span className="wb-formControl">{children}</span>
50
54
  {problem === undefined ? (
51
55
  hint === undefined ? null : (
@@ -54,6 +58,6 @@ export function FormRow({ label, hint, problem, layout = 'inline', children }: F
54
58
  ) : (
55
59
  <span className="wb-formProblem">{problem}</span>
56
60
  )}
57
- </label>
61
+ </div>
58
62
  );
59
63
  }
@@ -1,12 +1,6 @@
1
1
  /** 外壳插件的包名:浏览器模块表与宿主按它注册、认领这枚插件。 */
2
2
  export const PLUGIN_ID = "@dsh-workbench/core";
3
3
 
4
- /** 与外壳同批发布的兄弟包名:`release.ts` 用它判一版三包是否都已在源上。 */
5
- export const RELEASE_SIBLINGS = [
6
- "@dsh-workbench/shared",
7
- "@dsh-workbench/module-tools",
8
- ] as const;
9
-
10
4
  /** 外壳宿主 HTTP API 的根前缀;prefs / actions / provision 等路由都挂在它下面。 */
11
5
  export const API_PREFIX = "/workbench/api";
12
6
 
@@ -0,0 +1,25 @@
1
+ export interface CommandFile {
2
+ readonly content: string;
3
+ readonly suffix?: string | undefined;
4
+ }
5
+
6
+ export interface CommandRequest {
7
+ readonly argv: readonly string[];
8
+ readonly timeoutMs?: number | undefined;
9
+ readonly cwd?: string | undefined;
10
+ readonly files?: readonly CommandFile[] | undefined;
11
+ readonly appendFileArgs?: string | undefined;
12
+ }
13
+
14
+ export interface CommandResult {
15
+ readonly stdout: string;
16
+ readonly stderr: string;
17
+ readonly exitCode: number;
18
+ readonly timedOut: boolean;
19
+ readonly filePaths: readonly string[];
20
+ readonly error?: string | undefined;
21
+ }
22
+
23
+ export interface CommandReader {
24
+ run(request: CommandRequest): Promise<CommandResult>;
25
+ }
@@ -19,7 +19,8 @@ export interface BrowserDataRequest extends DataRequestBase {
19
19
 
20
20
  export interface CommandDataRequest extends DataRequestBase {
21
21
  readonly kind: 'command';
22
- readonly command: string;
22
+ readonly adapter: string;
23
+ readonly argv: readonly string[];
23
24
  }
24
25
 
25
26
  export type DataRequest = HttpDataRequest | BrowserDataRequest | CommandDataRequest;
@@ -0,0 +1,20 @@
1
+ export type ExtensionSession = 'persistent' | 'ephemeral' | 'none';
2
+
3
+ export interface ExtensionCallOptions {
4
+ readonly key?: string;
5
+ readonly workdir?: string;
6
+ readonly session?: ExtensionSession;
7
+ readonly timeoutMs?: number;
8
+ }
9
+
10
+ export interface ExtensionValue<T = unknown> {
11
+ readonly value: T;
12
+ readonly at: number;
13
+ }
14
+
15
+ export interface ExtensionCaller {
16
+ json(
17
+ args: readonly string[],
18
+ options?: ExtensionCallOptions,
19
+ ): Promise<ExtensionValue>;
20
+ }
@@ -0,0 +1,20 @@
1
+ export type OriginRead =
2
+ | { readonly kind: 'ok'; readonly remote: string }
3
+ | { readonly kind: 'no-origin'; readonly detail?: string }
4
+ | { readonly kind: 'unknown'; readonly reason: string; readonly detail?: string };
5
+
6
+ export type BranchRead =
7
+ | { readonly kind: 'ok'; readonly branch: string }
8
+ | { readonly kind: 'no-branch'; readonly detail?: string | undefined }
9
+ | { readonly kind: 'unknown'; readonly reason: string; readonly detail?: string | undefined };
10
+
11
+ export type HeadRead =
12
+ | { readonly kind: 'ok'; readonly commit: string }
13
+ | { readonly kind: 'no-head'; readonly detail?: string }
14
+ | { readonly kind: 'unknown'; readonly reason: string; readonly detail?: string };
15
+
16
+ export interface GitReader {
17
+ origin(path: string): Promise<OriginRead>;
18
+ branch(path: string): Promise<BranchRead>;
19
+ head(path: string): Promise<HeadRead>;
20
+ }
@@ -0,0 +1,5 @@
1
+ import type { LibNeed } from './needs.js';
2
+
3
+ export interface LibReader {
4
+ load<T = unknown>(need: LibNeed, entry: string): Promise<T>;
5
+ }
@@ -265,6 +265,7 @@ export function withDefaultAdapterSet(defaults: AdapterSet, loaded: AdapterSetLo
265
265
  id: set.id ?? defaults.id,
266
266
  version: set.version ?? defaults.version,
267
267
  data: set.data ?? defaults.data,
268
+ libs: set.libs ?? defaults.libs,
268
269
  supply: set.supply ?? defaults.supply,
269
270
  modules: set.modules ?? defaults.modules,
270
271
  profile: set.profile ?? defaults.profile,
@@ -1,5 +1,8 @@
1
1
  import type { DshHostContext } from '../api/dsh.js';
2
2
  import type { DataReader } from '../contract/data.js';
3
+ import type { LibReader } from '../contract/lib.js';
4
+ import type { GitReader } from '../contract/git.js';
5
+ import type { CommandReader } from '../contract/command.js';
3
6
  import type {
4
7
  EnvSupplyPort,
5
8
  HostActions,
@@ -21,6 +24,9 @@ export interface AdapterSet {
21
24
  readonly id: string;
22
25
  readonly version: string;
23
26
  readonly data: DataReader;
27
+ readonly libs?: LibReader | undefined;
28
+ readonly git?: GitReader | undefined;
29
+ readonly commands?: CommandReader | undefined;
24
30
  readonly supply: EnvSupplyPort;
25
31
  readonly modules: ModulePort;
26
32
  readonly profile: ProfilePort;