@dsh-workbench/shared 1.1.7 → 1.1.9

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 (239) hide show
  1. package/dist/api/blocker-table.d.ts +1 -0
  2. package/dist/api/blocker-table.js +1 -1
  3. package/dist/components/SelectField.css +0 -6
  4. package/dist/components/SelectField.d.ts +2 -3
  5. package/dist/components/SelectField.js +9 -30
  6. package/dist/components/SelectFieldNodes.d.ts +3 -1
  7. package/dist/components/SelectFieldNodes.js +2 -1
  8. package/dist/components/SelectFieldWheel.d.ts +9 -0
  9. package/dist/components/SelectFieldWheel.js +35 -0
  10. package/dist/config/constants.d.ts +4 -4
  11. package/dist/config/constants.js +4 -4
  12. package/dist/contract/capabilities.d.ts +29 -0
  13. package/dist/contract/capabilities.js +1 -0
  14. package/dist/contract/needs.d.ts +3 -3
  15. package/dist/contract/needs.js +1 -1
  16. package/dist/contract/plugin-source.d.ts +19 -0
  17. package/dist/contract/protocol/bundle-install.d.ts +3 -1
  18. package/dist/contract/protocol/bundle-install.js +3 -0
  19. package/dist/contract/protocol/market-index.d.ts +1 -0
  20. package/dist/contract/protocol/platform.d.ts +1 -1
  21. package/dist/contract/runner.d.ts +6 -0
  22. package/dist/contract/runner.js +1 -0
  23. package/dist/contract/unit.d.ts +4 -4
  24. package/dist/host/adapter-contract.d.ts +3 -0
  25. package/dist/host/adapter-contract.js +93 -0
  26. package/dist/host/adapter-set.js +6 -4
  27. package/dist/host/adapter-types.d.ts +1 -1
  28. package/dist/host/bundle-manager.d.ts +3 -0
  29. package/dist/host/bundle-manager.js +181 -0
  30. package/dist/host/cli.js +3 -1
  31. package/dist/host/config-sync.d.ts +48 -0
  32. package/dist/host/config-sync.js +342 -0
  33. package/dist/host/dsh-plugins.d.ts +5 -0
  34. package/dist/host/dsh-plugins.js +51 -0
  35. package/dist/host/extension.js +1 -1
  36. package/dist/host/flow/check.d.ts +9 -0
  37. package/dist/host/flow/check.js +179 -0
  38. package/dist/host/flow/expr.d.ts +30 -0
  39. package/dist/host/flow/expr.js +99 -0
  40. package/dist/host/flow/kit.d.ts +14 -0
  41. package/dist/host/flow/kit.js +13 -0
  42. package/dist/host/flow/run.d.ts +13 -0
  43. package/dist/host/flow/run.js +287 -0
  44. package/dist/host/flow/types.d.ts +188 -0
  45. package/dist/host/flow/types.js +1 -0
  46. package/dist/host/host-actions.d.ts +2 -0
  47. package/dist/host/host-actions.js +5 -0
  48. package/dist/host/host-kit.d.ts +19 -0
  49. package/dist/host/host-kit.js +14 -0
  50. package/dist/host/http.d.ts +2 -6
  51. package/dist/host/http.js +2 -2
  52. package/dist/host/installed-module.d.ts +23 -0
  53. package/dist/host/installed-module.js +264 -0
  54. package/dist/host/lib-install.d.ts +7 -9
  55. package/dist/host/lib-install.js +9 -12
  56. package/dist/host/lib-runners.d.ts +3 -5
  57. package/dist/host/lib-runners.js +2 -2
  58. package/dist/host/local-declaration.d.ts +7 -0
  59. package/dist/host/local-declaration.js +33 -0
  60. package/dist/host/market-index-claim.d.ts +0 -1
  61. package/dist/host/market-index-claim.js +0 -3
  62. package/dist/host/market-index-doc.d.ts +1 -45
  63. package/dist/host/market-index-parse.d.ts +9 -4
  64. package/dist/host/market-index-parse.js +17 -92
  65. package/dist/host/market-index.d.ts +5 -6
  66. package/dist/host/market-index.js +29 -87
  67. package/dist/host/module-root.d.ts +1 -0
  68. package/dist/host/module-root.js +5 -0
  69. package/dist/host/npm-registry.d.ts +10 -0
  70. package/dist/host/npm-registry.js +16 -0
  71. package/dist/host/opencli-runner.d.ts +2 -1
  72. package/dist/host/package-content.d.ts +7 -0
  73. package/dist/host/package-content.js +69 -0
  74. package/dist/host/package-kind.d.ts +13 -0
  75. package/dist/host/package-kind.js +51 -0
  76. package/dist/host/package-route.d.ts +31 -0
  77. package/dist/host/package-route.js +57 -0
  78. package/dist/host/paths.d.ts +11 -19
  79. package/dist/host/paths.js +16 -43
  80. package/dist/host/platform.js +1 -1
  81. package/dist/host/plugin-ledger.d.ts +8 -8
  82. package/dist/host/plugin-ledger.js +23 -16
  83. package/dist/host/plugin.d.ts +1 -2
  84. package/dist/host/plugin.js +4 -5
  85. package/dist/host/port-types.d.ts +42 -9
  86. package/dist/host/preflight.d.ts +3 -2
  87. package/dist/host/profile-create.d.ts +18 -0
  88. package/dist/host/profile-create.js +118 -0
  89. package/dist/host/profile-registries.d.ts +10 -0
  90. package/dist/host/profile-registries.js +150 -0
  91. package/dist/host/registry-declaration.d.ts +21 -0
  92. package/dist/host/registry-declaration.js +33 -0
  93. package/dist/host/release-probe.d.ts +34 -0
  94. package/dist/host/release-probe.js +88 -0
  95. package/dist/host/runner.d.ts +26 -0
  96. package/dist/host/runner.js +50 -0
  97. package/dist/host/shell.d.ts +0 -2
  98. package/dist/host/shell.js +0 -7
  99. package/dist/host/spec.js +1 -1
  100. package/dist/host/supply-index.d.ts +1 -0
  101. package/dist/host/supply-index.js +8 -7
  102. package/dist/host/supply-port.js +13 -3
  103. package/dist/host/unit-face.d.ts +2 -1
  104. package/dist/host/version.js +11 -6
  105. package/dist/host.d.ts +24 -6
  106. package/dist/host.js +23 -6
  107. package/dist/i18n/en.js +19 -20
  108. package/dist/i18n/index.d.ts +20 -21
  109. package/dist/i18n/runtime-terms.d.ts +15 -0
  110. package/dist/i18n/runtime-terms.js +22 -0
  111. package/dist/i18n/zh.d.ts +19 -20
  112. package/dist/i18n/zh.js +19 -20
  113. package/dist/index.d.ts +4 -0
  114. package/dist/index.js +4 -0
  115. package/dist/testing/fake-adapter-set.d.ts +5 -0
  116. package/dist/testing/fake-adapter-set.js +150 -0
  117. package/dist/testing/needs.js +1 -1
  118. package/dist/testing.d.ts +1 -0
  119. package/dist/testing.js +1 -0
  120. package/package.json +1 -1
  121. package/src/api/__tests__/blocker-table.test.ts +25 -0
  122. package/src/api/{workbench-client.test.ts → __tests__/workbench-client.test.ts} +2 -2
  123. package/src/api/blocker-table.ts +6 -2
  124. package/src/components/SelectField.css +0 -6
  125. package/src/components/SelectField.tsx +7 -36
  126. package/src/components/SelectFieldNodes.tsx +4 -1
  127. package/src/components/{Card.test.tsx → __tests__/Card.test.tsx} +2 -2
  128. package/src/components/{CardAnchor.test.tsx → __tests__/CardAnchor.test.tsx} +3 -3
  129. package/src/components/{CardHead.test.tsx → __tests__/CardHead.test.tsx} +1 -1
  130. package/src/components/{ChoiceGroup.test.tsx → __tests__/ChoiceGroup.test.tsx} +2 -2
  131. package/src/components/{ConfirmBar.test.tsx → __tests__/ConfirmBar.test.tsx} +5 -5
  132. package/src/components/{Field.test.tsx → __tests__/Field.test.tsx} +1 -1
  133. package/src/components/{Form.test.tsx → __tests__/Form.test.tsx} +5 -5
  134. package/src/components/{FormActions.test.tsx → __tests__/FormActions.test.tsx} +3 -3
  135. package/src/components/{FormRows.test.tsx → __tests__/FormRows.test.tsx} +2 -2
  136. package/src/components/{FormTypes.test.ts → __tests__/FormTypes.test.ts} +1 -1
  137. package/src/components/{FormWiring.test.tsx → __tests__/FormWiring.test.tsx} +4 -4
  138. package/src/components/{Link.test.tsx → __tests__/Link.test.tsx} +1 -1
  139. package/src/components/{Rows.test.tsx → __tests__/Rows.test.tsx} +2 -2
  140. package/src/components/{SelectField.test.tsx → __tests__/SelectField.test.tsx} +7 -37
  141. package/src/components/{Spinner.test.tsx → __tests__/Spinner.test.tsx} +4 -4
  142. package/src/config/{constants.test.ts → __tests__/constants.test.ts} +1 -1
  143. package/src/config/{storage.test.ts → __tests__/storage.test.ts} +1 -1
  144. package/src/config/constants.ts +4 -4
  145. package/src/contract/capabilities.ts +30 -0
  146. package/src/contract/needs.ts +4 -4
  147. package/src/contract/plugin-source.ts +24 -0
  148. package/src/contract/protocol/bundle-install.ts +7 -1
  149. package/src/contract/protocol/market-index.ts +1 -0
  150. package/src/contract/protocol/platform.ts +1 -1
  151. package/src/contract/runner.ts +6 -0
  152. package/src/contract/unit.ts +4 -4
  153. package/src/host/{extension.test.ts → __tests__/extension.test.ts} +4 -4
  154. package/src/host/{install-failure.test.ts → __tests__/install-failure.test.ts} +1 -1
  155. package/src/host/{installed-sources.test.ts → __tests__/installed-sources.test.ts} +1 -1
  156. package/src/host/__tests__/lib-runners.test.ts +11 -2
  157. package/src/host/__tests__/market-index-assemble.test.ts +26 -0
  158. package/src/host/__tests__/market-index.test.ts +41 -51
  159. package/src/host/__tests__/plugin-ledger.test.ts +19 -6
  160. package/src/host/{recipe.test.ts → __tests__/recipe.test.ts} +3 -3
  161. package/src/host/__tests__/runtime-layout.test.ts +14 -0
  162. package/src/host/__tests__/supply-index.test.ts +2 -2
  163. package/src/host/__tests__/supply-port.test.ts +32 -0
  164. package/src/host/adapter-contract.ts +93 -0
  165. package/src/host/adapter-set.ts +6 -4
  166. package/src/host/adapter-types.ts +1 -1
  167. package/src/host/bundle-manager.ts +195 -0
  168. package/src/host/cli.ts +3 -1
  169. package/src/host/config-sync.ts +386 -0
  170. package/src/host/dsh-plugins.ts +60 -0
  171. package/src/host/extension.ts +1 -1
  172. package/src/host/flow/__tests__/advanced.test.ts +302 -0
  173. package/src/host/flow/__tests__/check.test.ts +169 -0
  174. package/src/host/flow/__tests__/run.test.ts +301 -0
  175. package/src/host/flow/check.ts +216 -0
  176. package/src/host/flow/expr.ts +94 -0
  177. package/src/host/flow/kit.ts +30 -0
  178. package/src/host/flow/run.ts +325 -0
  179. package/src/host/flow/types.ts +199 -0
  180. package/src/host/host-actions.ts +7 -0
  181. package/src/host/host-kit.ts +26 -0
  182. package/src/host/http.ts +6 -8
  183. package/src/host/installed-module.ts +272 -0
  184. package/src/host/lib-install.ts +14 -12
  185. package/src/host/lib-runners.ts +6 -8
  186. package/src/host/local-declaration.ts +37 -0
  187. package/src/host/market-index-claim.ts +0 -4
  188. package/src/host/market-index-doc.ts +1 -53
  189. package/src/host/market-index-parse.ts +21 -85
  190. package/src/host/market-index.ts +33 -127
  191. package/src/host/module-root.ts +6 -0
  192. package/src/host/npm-registry.ts +21 -0
  193. package/src/host/package-content.ts +76 -0
  194. package/src/host/package-kind.ts +63 -0
  195. package/src/host/package-route.ts +93 -0
  196. package/src/host/paths.ts +27 -52
  197. package/src/host/platform.ts +1 -1
  198. package/src/host/plugin-ledger.ts +25 -18
  199. package/src/host/plugin.ts +4 -5
  200. package/src/host/port-types.ts +43 -9
  201. package/src/host/preflight.ts +3 -2
  202. package/src/host/profile-create.ts +133 -0
  203. package/src/host/profile-registries.ts +145 -0
  204. package/src/host/registry-declaration.ts +70 -0
  205. package/src/host/release-probe.ts +202 -0
  206. package/src/host/shell.ts +0 -9
  207. package/src/host/spec.ts +1 -1
  208. package/src/host/supply-index.ts +9 -7
  209. package/src/host/supply-port.ts +13 -3
  210. package/src/host/unit-face.ts +2 -1
  211. package/src/host/version.ts +12 -7
  212. package/src/host.ts +34 -6
  213. package/src/i18n/{index.test.ts → __tests__/index.test.ts} +3 -3
  214. package/src/i18n/{merge.test.ts → __tests__/merge.test.ts} +1 -1
  215. package/src/i18n/{zh.test.ts → __tests__/zh.test.ts} +2 -2
  216. package/src/i18n/en.ts +19 -21
  217. package/src/i18n/runtime-terms.ts +26 -0
  218. package/src/i18n/zh.ts +19 -21
  219. package/src/index.ts +4 -0
  220. package/src/lib/{board-fact.test.ts → __tests__/board-fact.test.ts} +1 -1
  221. package/src/lib/{busy.test.ts → __tests__/busy.test.ts} +1 -1
  222. package/src/lib/{form-problem.test.ts → __tests__/form-problem.test.ts} +1 -1
  223. package/src/lib/{git-address.test.ts → __tests__/git-address.test.ts} +1 -1
  224. package/src/lib/{react.test.ts → __tests__/react.test.ts} +1 -1
  225. package/src/lib/{text.test.ts → __tests__/text.test.ts} +1 -1
  226. package/src/lib/{ui.test.ts → __tests__/ui.test.ts} +1 -1
  227. package/src/testing/__tests__/fake-adapter-set.test.ts +28 -0
  228. package/src/testing/fake-adapter-set.ts +173 -0
  229. package/src/testing/needs.ts +1 -1
  230. package/src/testing.ts +1 -0
  231. package/src/host/__tests__/command-name.test.ts +0 -16
  232. package/src/host/__tests__/opencli-runner.test.ts +0 -120
  233. package/src/host/channel-plugin.ts +0 -55
  234. package/src/host/command-name.ts +0 -15
  235. package/src/host/opencli-runner.ts +0 -76
  236. package/src/host/paths.test.ts +0 -26
  237. package/src/host/plugin-source.ts +0 -137
  238. package/src/host/runtime-links.test.ts +0 -31
  239. package/src/host/runtime-links.ts +0 -23
package/dist/i18n/zh.d.ts CHANGED
@@ -82,7 +82,11 @@ export declare const zh: {
82
82
  readonly 'time.short.years': "{n}年";
83
83
  readonly 'panels.title': "面板模块";
84
84
  readonly 'panels.groupBoardless': "无看板模块";
85
- readonly 'panels.groupPlugins': "opencli 插件";
85
+ readonly 'panels.groupPlugins': "插件";
86
+ readonly 'runtime.plugin': "插件";
87
+ readonly 'runtime.pluginOf': "运行时提供的插件";
88
+ readonly 'runtime.pluginThing': "插件";
89
+ readonly 'runtime.pluginArea': "插件区";
86
90
  readonly 'panels.market.defaultHint': "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭";
87
91
  readonly 'panels.market.defaultLabel': "全局默认开启";
88
92
  readonly 'panels.market.defaultLocked': "这份现在用不了,先更新或卸载";
@@ -160,9 +164,6 @@ export declare const zh: {
160
164
  readonly 'panels.market.confirmNo': "取消";
161
165
  readonly 'panels.market.noMarketSource': "索引里没有这个模块的新版本(刷新一次索引再试)";
162
166
  readonly 'panels.market.failed': "没成功:{reason}";
163
- readonly 'panels.market.askAgent': "问 agent";
164
- readonly 'panels.market.askAgentCopied': "已复制";
165
- readonly 'panels.market.askAgentText': "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。";
166
167
  readonly 'panels.market.failure.permission': "没装上:没有写入权限";
167
168
  readonly 'panels.market.failure.diskFull': "没装上:磁盘满了";
168
169
  readonly 'panels.market.failure.sandbox': "没装上:被系统拦住了";
@@ -202,7 +203,7 @@ export declare const zh: {
202
203
  readonly 'panels.market.noSource': "这个模块没声明怎么装,只能自己动手";
203
204
  readonly 'panels.market.badSource': "安装方式没写全,只能自己动手";
204
205
  readonly 'panels.market.empty': "暂无可用模块";
205
- readonly 'panels.market.sectionPlugins': "已安装 opencli 插件";
206
+ readonly 'panels.market.sectionPlugins': "已安装的插件";
206
207
  readonly 'panels.market.moduleOutdated': "有新版";
207
208
  readonly 'panels.market.updateNeedsWorkbench': "新版本要先把工作台升级才能用";
208
209
  readonly 'panels.market.updateIncompatible': "新版本和当前的工作台不匹配,暂时不能更新";
@@ -240,7 +241,7 @@ export declare const zh: {
240
241
  readonly 'panels.market.justNow': "刚刚";
241
242
  readonly 'panels.market.minutesAgo': "{n} 分钟前";
242
243
  readonly 'panels.market.hoursAgo': "{n} 小时前";
243
- readonly 'panels.market.add.description': "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。";
244
+ readonly 'panels.market.add.description': "输入模块或 {plugin}的包名、Git 仓库地址或本地目录路径。";
244
245
  readonly 'panels.market.add.specPlaceholder': "例如 @dsh-workbench/module-hello";
245
246
  readonly 'panels.market.add.guideToggle': "模块安装引导和示例";
246
247
  readonly 'panels.market.add.guideHide': "收起引导";
@@ -279,12 +280,12 @@ export declare const zh: {
279
280
  readonly 'panels.market.add.problemInstalled': "这个模块已经装过了(要换版本请带上 @版本)";
280
281
  readonly 'panels.market.add.problemNotFound': "未找到相关模块";
281
282
  readonly 'panels.market.add.problemNotPackage': "该路径不存在或不是有效的模块包";
282
- readonly 'panels.market.add.problemNotBundle': "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。";
283
+ readonly 'panels.market.add.problemNotBundle': "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 {plugin},两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。";
283
284
  readonly 'panels.market.add.problemNotWorkbenchModule': "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。";
284
- readonly 'panels.market.add.problemNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。";
285
- readonly 'panels.market.add.failureNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上";
286
- readonly 'panels.market.add.installedPlugin': "装上了:opencli 插件 {name}";
287
- readonly 'panels.market.add.pluginPreview': "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。";
285
+ readonly 'panels.market.add.problemNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上。换一个版本,或者找这个包的作者。";
286
+ readonly 'panels.market.add.failureNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上";
287
+ readonly 'panels.market.add.installedPlugin': "装上了:{plugin} {name}";
288
+ readonly 'panels.market.add.pluginPreview': "这是一份 {pluginThing}:装进 {pluginArea},装完就能用,不用重启。";
288
289
  readonly 'panels.market.add.pluginAlias': "插件名:{name}";
289
290
  readonly 'panels.market.add.problemNetwork': "无法连接模块源,请检查网络后重试";
290
291
  readonly 'panels.market.add.problemUnknown': "无法获取模块信息:{reason}";
@@ -380,7 +381,7 @@ export declare const zh: {
380
381
  readonly 'panels.discover.missingIndex': "仓库里还没有索引文件 {path}";
381
382
  readonly 'panels.discover.initTitle': "把这个仓库初始化成模块市场索引?";
382
383
  readonly 'panels.discover.initCta': "初始化成市场索引";
383
- readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/<版本>/,条目写到 market/<包名>/<版本>.json。仓库的写权限归它的所有者。";
384
+ readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。";
384
385
  readonly 'panels.discover.initBranch': "分支";
385
386
  readonly 'panels.discover.initBranchHint': "索引和打包文件都发到这个分支;空仓库会新建它。";
386
387
  readonly 'panels.discover.initBranchBad': "分支名只能用字母、数字、点、下划线、斜杠或短横线";
@@ -560,7 +561,7 @@ export declare const zh: {
560
561
  readonly 'blocker.forbidden.hint': "账号已登录,但没有这个项目/仓库的权限;申请之后再试。";
561
562
  readonly 'blocker.forbidden.open': "打开权限页";
562
563
  readonly 'blocker.timeout.hint': "后台浏览器没起来,重试一次通常就好。";
563
- readonly 'blocker.exec.hint': "确认 opencli 已经装好、在终端里能直接运行(which opencli)。";
564
+ readonly 'blocker.exec.hint': "确认运行时已经装好、在终端里能直接跑起来。";
564
565
  readonly 'blocker.unknown.title': "出了点问题";
565
566
  readonly 'panels.reading': "正在读取面板配置…";
566
567
  readonly 'panels.cardBroken': "这个模块起不来:{unit}({reason})";
@@ -577,16 +578,11 @@ export declare const zh: {
577
578
  readonly 'env.stepFailed.shell': "连不上命令行";
578
579
  readonly 'env.toolchain.ok': "正常";
579
580
  readonly 'env.toolchain.warn': "还没完全准备好";
580
- readonly 'env.opencli.ok': "已就绪";
581
+ readonly 'env.runtime.ok': "已就绪";
581
582
  readonly 'env.bridge.ok': "已连接";
582
583
  readonly 'env.bridge.short': "还没连上";
583
584
  readonly 'env.bridge.why': "面板的数据要用你浏览器里的登录状态。这个连接没通,模块就取不到数据;不拦路:修好它,或者先进入工作台。";
584
585
  readonly 'env.bridge.hold': "浏览器还没连上 —— 按下面修好后点「重试」,也可以先进工作台。";
585
- readonly 'env.bridge.daemon': "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。";
586
- readonly 'env.bridge.extension': "浏览器扩展没连上:确认浏览器开着、扩展已启用;没装就从商店装一次(装完回来点「重试」)。";
587
- readonly 'env.bridge.extensionLink': "去 Chrome 应用商店装扩展";
588
- readonly 'env.bridge.profile': "连上了多个浏览器账号,但没选默认的那个:先看有哪些(下面这条命令),再选一个。";
589
- readonly 'env.bridge.stale': "默认的浏览器账号已经失效(它记的是上一次的扩展实例):重新选一个。";
590
586
  readonly 'env.bridge.unknown': "没认出是哪种问题:展开原文,按里面的步骤处理。";
591
587
  readonly 'env.fix.title': "怎么解决";
592
588
  readonly 'env.fix.why': "工作台用它自己那份后台工具(与你在终端里那套分开装,互不影响),这台机器上还没装好它。";
@@ -616,7 +612,8 @@ export declare const zh: {
616
612
  readonly 'env.copyCommand': "复制命令";
617
613
  readonly 'env.copied': "已复制";
618
614
  readonly 'env.step.toolchain': "运行环境";
619
- readonly 'env.step.opencli': "后台工具";
615
+ readonly 'env.step.adapter': "运行时";
616
+ readonly 'env.step.runtime': "后台工具";
620
617
  readonly 'env.step.bridge': "浏览器连接";
621
618
  readonly 'env.step.diy': "DIY 模式";
622
619
  readonly 'env.step.warm': "站点登录状态";
@@ -711,6 +708,8 @@ export declare const zh: {
711
708
  readonly 'approval.publish.version': "版本";
712
709
  readonly 'approval.publish.author': "作者";
713
710
  readonly 'approval.publish.authorMissing': "未署名";
711
+ readonly 'approval.publish.labels': "标签";
712
+ readonly 'approval.publish.labelsMissing': "还没有(发布到市场时补 1–2 个)";
714
713
  readonly 'approval.publish.owner': "认领人";
715
714
  readonly 'approval.publish.ownerUnowned': "原来没署名";
716
715
  readonly 'approval.publish.ownerTaken': "已有主人:{owner}";
package/dist/i18n/zh.js CHANGED
@@ -74,7 +74,11 @@ export const zh = {
74
74
  'time.short.years': '{n}年',
75
75
  'panels.title': '面板模块',
76
76
  'panels.groupBoardless': '无看板模块',
77
- 'panels.groupPlugins': 'opencli 插件',
77
+ 'panels.groupPlugins': '插件',
78
+ 'runtime.plugin': '插件',
79
+ 'runtime.pluginOf': '运行时提供的插件',
80
+ 'runtime.pluginThing': '插件',
81
+ 'runtime.pluginArea': '插件区',
78
82
  'panels.market.defaultHint': '打开后所有工作区默认开启,也可在工作区面板配置中单独关闭',
79
83
  'panels.market.defaultLabel': '全局默认开启',
80
84
  'panels.market.defaultLocked': '这份现在用不了,先更新或卸载',
@@ -152,9 +156,6 @@ export const zh = {
152
156
  'panels.market.confirmNo': '取消',
153
157
  'panels.market.noMarketSource': '索引里没有这个模块的新版本(刷新一次索引再试)',
154
158
  'panels.market.failed': '没成功:{reason}',
155
- 'panels.market.askAgent': '问 agent',
156
- 'panels.market.askAgentCopied': '已复制',
157
- 'panels.market.askAgentText': '工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。',
158
159
  'panels.market.failure.permission': '没装上:没有写入权限',
159
160
  'panels.market.failure.diskFull': '没装上:磁盘满了',
160
161
  'panels.market.failure.sandbox': '没装上:被系统拦住了',
@@ -194,7 +195,7 @@ export const zh = {
194
195
  'panels.market.noSource': '这个模块没声明怎么装,只能自己动手',
195
196
  'panels.market.badSource': '安装方式没写全,只能自己动手',
196
197
  'panels.market.empty': '暂无可用模块',
197
- 'panels.market.sectionPlugins': '已安装 opencli 插件',
198
+ 'panels.market.sectionPlugins': '已安装的插件',
198
199
  'panels.market.moduleOutdated': '有新版',
199
200
  'panels.market.updateNeedsWorkbench': '新版本要先把工作台升级才能用',
200
201
  'panels.market.updateIncompatible': '新版本和当前的工作台不匹配,暂时不能更新',
@@ -232,7 +233,7 @@ export const zh = {
232
233
  'panels.market.justNow': '刚刚',
233
234
  'panels.market.minutesAgo': '{n} 分钟前',
234
235
  'panels.market.hoursAgo': '{n} 小时前',
235
- 'panels.market.add.description': '输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。',
236
+ 'panels.market.add.description': '输入模块或 {plugin}的包名、Git 仓库地址或本地目录路径。',
236
237
  'panels.market.add.specPlaceholder': '例如 @dsh-workbench/module-hello',
237
238
  'panels.market.add.guideToggle': '模块安装引导和示例',
238
239
  'panels.market.add.guideHide': '收起引导',
@@ -271,12 +272,12 @@ export const zh = {
271
272
  'panels.market.add.problemInstalled': '这个模块已经装过了(要换版本请带上 @版本)',
272
273
  'panels.market.add.problemNotFound': '未找到相关模块',
273
274
  'panels.market.add.problemNotPackage': '该路径不存在或不是有效的模块包',
274
- 'panels.market.add.problemNotBundle': '这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。',
275
+ 'panels.market.add.problemNotBundle': '这个包装不进这里:{reason}。这个入口按包名认工作台模块和 {plugin},两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。',
275
276
  'panels.market.add.problemNotWorkbenchModule': '这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。',
276
- 'panels.market.add.problemNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。',
277
- 'panels.market.add.failureNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上',
278
- 'panels.market.add.installedPlugin': '装上了:opencli 插件 {name}',
279
- 'panels.market.add.pluginPreview': '这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。',
277
+ 'panels.market.add.problemNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上。换一个版本,或者找这个包的作者。',
278
+ 'panels.market.add.failureNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上',
279
+ 'panels.market.add.installedPlugin': '装上了:{plugin} {name}',
280
+ 'panels.market.add.pluginPreview': '这是一份 {pluginThing}:装进 {pluginArea},装完就能用,不用重启。',
280
281
  'panels.market.add.pluginAlias': '插件名:{name}',
281
282
  'panels.market.add.problemNetwork': '无法连接模块源,请检查网络后重试',
282
283
  'panels.market.add.problemUnknown': '无法获取模块信息:{reason}',
@@ -372,7 +373,7 @@ export const zh = {
372
373
  'panels.discover.missingIndex': '仓库里还没有索引文件 {path}',
373
374
  'panels.discover.initTitle': '把这个仓库初始化成模块市场索引?',
374
375
  'panels.discover.initCta': '初始化成市场索引',
375
- 'panels.discover.initWhat': '会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/<版本>/,条目写到 market/<包名>/<版本>.json。仓库的写权限归它的所有者。',
376
+ 'panels.discover.initWhat': '会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。',
376
377
  'panels.discover.initBranch': '分支',
377
378
  'panels.discover.initBranchHint': '索引和打包文件都发到这个分支;空仓库会新建它。',
378
379
  'panels.discover.initBranchBad': '分支名只能用字母、数字、点、下划线、斜杠或短横线',
@@ -552,7 +553,7 @@ export const zh = {
552
553
  'blocker.forbidden.hint': '账号已登录,但没有这个项目/仓库的权限;申请之后再试。',
553
554
  'blocker.forbidden.open': '打开权限页',
554
555
  'blocker.timeout.hint': '后台浏览器没起来,重试一次通常就好。',
555
- 'blocker.exec.hint': '确认 opencli 已经装好、在终端里能直接运行(which opencli)。',
556
+ 'blocker.exec.hint': '确认运行时已经装好、在终端里能直接跑起来。',
556
557
  'blocker.unknown.title': '出了点问题',
557
558
  'panels.reading': '正在读取面板配置…',
558
559
  'panels.cardBroken': '这个模块起不来:{unit}({reason})',
@@ -569,16 +570,11 @@ export const zh = {
569
570
  'env.stepFailed.shell': '连不上命令行',
570
571
  'env.toolchain.ok': '正常',
571
572
  'env.toolchain.warn': '还没完全准备好',
572
- 'env.opencli.ok': '已就绪',
573
+ 'env.runtime.ok': '已就绪',
573
574
  'env.bridge.ok': '已连接',
574
575
  'env.bridge.short': '还没连上',
575
576
  'env.bridge.why': '面板的数据要用你浏览器里的登录状态。这个连接没通,模块就取不到数据;不拦路:修好它,或者先进入工作台。',
576
577
  'env.bridge.hold': '浏览器还没连上 —— 按下面修好后点「重试」,也可以先进工作台。',
577
- 'env.bridge.daemon': '后台服务没起来:正常它会自己起,先在终端跑下面这条命令。',
578
- 'env.bridge.extension': '浏览器扩展没连上:确认浏览器开着、扩展已启用;没装就从商店装一次(装完回来点「重试」)。',
579
- 'env.bridge.extensionLink': '去 Chrome 应用商店装扩展',
580
- 'env.bridge.profile': '连上了多个浏览器账号,但没选默认的那个:先看有哪些(下面这条命令),再选一个。',
581
- 'env.bridge.stale': '默认的浏览器账号已经失效(它记的是上一次的扩展实例):重新选一个。',
582
578
  'env.bridge.unknown': '没认出是哪种问题:展开原文,按里面的步骤处理。',
583
579
  'env.fix.title': '怎么解决',
584
580
  'env.fix.why': '工作台用它自己那份后台工具(与你在终端里那套分开装,互不影响),这台机器上还没装好它。',
@@ -608,7 +604,8 @@ export const zh = {
608
604
  'env.copyCommand': '复制命令',
609
605
  'env.copied': '已复制',
610
606
  'env.step.toolchain': '运行环境',
611
- 'env.step.opencli': '后台工具',
607
+ 'env.step.adapter': '运行时',
608
+ 'env.step.runtime': '后台工具',
612
609
  'env.step.bridge': '浏览器连接',
613
610
  'env.step.diy': 'DIY 模式',
614
611
  'env.step.warm': '站点登录状态',
@@ -703,6 +700,8 @@ export const zh = {
703
700
  'approval.publish.version': '版本',
704
701
  'approval.publish.author': '作者',
705
702
  'approval.publish.authorMissing': '未署名',
703
+ 'approval.publish.labels': '标签',
704
+ 'approval.publish.labelsMissing': '还没有(发布到市场时补 1–2 个)',
706
705
  'approval.publish.owner': '认领人',
707
706
  'approval.publish.ownerUnowned': '原来没署名',
708
707
  'approval.publish.ownerTaken': '已有主人:{owner}',
package/dist/index.d.ts CHANGED
@@ -42,6 +42,8 @@ export * from './contract/extension.js';
42
42
  export * from './contract/lib.js';
43
43
  export * from './contract/git.js';
44
44
  export * from './contract/command.js';
45
+ export * from './contract/runner.js';
46
+ export * from './contract/plugin-source.js';
45
47
  export * from './contract/facts.js';
46
48
  export * from './contract/long-task.js';
47
49
  export * from './contract/protocol/bundle-install.js';
@@ -57,12 +59,14 @@ export * from './contract/protocol/unit-manifests.js';
57
59
  export * from './contract/unit-board.js';
58
60
  export * from './contract/unit-declaration.js';
59
61
  export * from './contract/unit.js';
62
+ export * from './contract/capabilities.js';
60
63
  export * from './contract/needs.js';
61
64
  export * from './contract/unit-capability.js';
62
65
  export * from './contract/workbench-contract.js';
63
66
  export * from './i18n/en.js';
64
67
  export * from './i18n/index.js';
65
68
  export * from './i18n/merge.js';
69
+ export * from './i18n/runtime-terms.js';
66
70
  export * from './i18n/settings.js';
67
71
  export * from './i18n/zh.js';
68
72
  export * from './lib/blocker-action.js';
package/dist/index.js CHANGED
@@ -42,6 +42,8 @@ export * from './contract/extension.js';
42
42
  export * from './contract/lib.js';
43
43
  export * from './contract/git.js';
44
44
  export * from './contract/command.js';
45
+ export * from './contract/runner.js';
46
+ export * from './contract/plugin-source.js';
45
47
  export * from './contract/facts.js';
46
48
  export * from './contract/long-task.js';
47
49
  export * from './contract/protocol/bundle-install.js';
@@ -57,12 +59,14 @@ export * from './contract/protocol/unit-manifests.js';
57
59
  export * from './contract/unit-board.js';
58
60
  export * from './contract/unit-declaration.js';
59
61
  export * from './contract/unit.js';
62
+ export * from './contract/capabilities.js';
60
63
  export * from './contract/needs.js';
61
64
  export * from './contract/unit-capability.js';
62
65
  export * from './contract/workbench-contract.js';
63
66
  export * from './i18n/en.js';
64
67
  export * from './i18n/index.js';
65
68
  export * from './i18n/merge.js';
69
+ export * from './i18n/runtime-terms.js';
66
70
  export * from './i18n/settings.js';
67
71
  export * from './i18n/zh.js';
68
72
  export * from './lib/blocker-action.js';
@@ -0,0 +1,5 @@
1
+ import type { AdapterSet } from '../host/adapters.js';
2
+ export declare const FAKE_ADAPTER_MARKER: {
3
+ readonly adapterSet: "fake";
4
+ };
5
+ export declare function fakeAdapterSet(overrides?: Partial<AdapterSet>): AdapterSet;
@@ -0,0 +1,150 @@
1
+ import { ADAPTER_SET_API_VERSION } from '../host/adapters.js';
2
+ import { readBundleManager } from '../host/bundle-manager.js';
3
+ import { declarationGaps, moduleDeclarationOf, profileDirOf, profileModules, readInstalledModule, readProfilePackage, } from '../host/installed-module.js';
4
+ import { isNewerVersion } from '../host/version.js';
5
+ import { refusalReason } from '../host/spec.js';
6
+ import { declarationRefusalOf, pathDeclarationOf } from '../host/local-declaration.js';
7
+ import { createRegistryLookup } from '../host/registry-declaration.js';
8
+ import { createPackageRouter } from '../host/package-route.js';
9
+ import { createReleaseProbe } from '../host/release-probe.js';
10
+ export const FAKE_ADAPTER_MARKER = { adapterSet: 'fake' };
11
+ function result() {
12
+ return { ok: true, data: FAKE_ADAPTER_MARKER };
13
+ }
14
+ const data = {
15
+ async read(_request) {
16
+ return result();
17
+ },
18
+ async request(_recipe) {
19
+ return result();
20
+ },
21
+ async requestMany(_recipe, _calls) {
22
+ return {};
23
+ },
24
+ async submit(_recipe) {
25
+ return result();
26
+ },
27
+ };
28
+ const supply = {
29
+ resolvePluginSource: () => ({ ok: false, problem: 'not-declared' }),
30
+ libInstallCommand: () => '',
31
+ libUninstallCommand: () => '',
32
+ pluginInstallPlan: () => ({ ok: false, problem: 'not-declared' }),
33
+ latestVersion: async () => undefined,
34
+ missingReleaseParts: async () => [],
35
+ probeRelease: async () => undefined,
36
+ splitNpmSpec: () => undefined,
37
+ };
38
+ const modules = {
39
+ isolatedRoot: () => '/tmp/dsh-workbench-fake',
40
+ isolatedHome: () => '/tmp/dsh-workbench-fake/home',
41
+ pluginPackagePrefix: () => 'fake-plugin-',
42
+ pluginManifestFile: () => 'fake-plugin.json',
43
+ cliCatalogPath: () => '/tmp/dsh-workbench-fake/catalog.json',
44
+ vendorPluginsDir: () => '/tmp/dsh-workbench-fake/plugins',
45
+ runtimeInstallCommand: () => 'npm i -g fake-runtime',
46
+ afterLibInstall: () => undefined,
47
+ profileDirOf: (ctx) => profileDirOf(ctx),
48
+ profileModules,
49
+ readInstalledModule,
50
+ readProfilePackage,
51
+ readBundleManager,
52
+ createRegistryNotebook: () => ({}),
53
+ declarationGaps,
54
+ moduleDeclarationOf,
55
+ registryDeclarationOf: async () => undefined,
56
+ pathDeclarationOf,
57
+ declarationRefusalOf,
58
+ refusalReason,
59
+ packageRouteOf: async () => undefined,
60
+ isNewerVersion,
61
+ startSelfUpdate: () => ({}),
62
+ };
63
+ const profile = {
64
+ dirOf: () => null,
65
+ dshPlugins: () => () => ({ ok: true, plugins: [] }),
66
+ selfUpdateView: () => undefined,
67
+ };
68
+ const probe = {
69
+ probeUnits: async () => [],
70
+ registerPreflight: () => undefined,
71
+ declaredPluginCommands: () => new Map(),
72
+ };
73
+ const runtimePreset = (capabilities) => ({
74
+ packageRoot: () => '/tmp/dsh-workbench-fake',
75
+ capabilities: () => capabilities,
76
+ profile: () => ({
77
+ label: 'fake',
78
+ terms: {
79
+ plugin: { zh: '插件', en: 'plugin' },
80
+ pluginOf: { zh: '的插件', en: 'a plugin of' },
81
+ pluginThing: { zh: '插件', en: 'a plugin' },
82
+ pluginArea: { zh: '插件区', en: 'the plugin area' },
83
+ },
84
+ installHint: { zh: '无', en: 'nothing to install' },
85
+ diagnose: {},
86
+ }),
87
+ commandSurface: () => ({
88
+ name: 'fake',
89
+ pluginPrefix: 'fake-plugin-',
90
+ invoke: (site, command) => (command === undefined ? `fake ${site}` : `fake ${site} ${command}`),
91
+ help: (site) => `fake ${site} --help`,
92
+ browser: (verb) => `fake browser ${verb.join(' ')}`,
93
+ }),
94
+ commands: () => ({}),
95
+ runners: () => ({}),
96
+ health: () => ({}),
97
+ seed: () => undefined,
98
+ warnUnwritableRoot: () => undefined,
99
+ });
100
+ const plugins = {
101
+ declarationLookup: () => () => undefined,
102
+ createUnits: () => ({
103
+ refresh: async () => ({ units: [] }),
104
+ touch: () => undefined,
105
+ report: () => ({ units: [] }),
106
+ dispose: () => undefined,
107
+ }),
108
+ };
109
+ const actions = {
110
+ configSyncHandler: () => (async () => ({ ok: true })),
111
+ profileCreateHandler: () => (async () => ({ ok: true })),
112
+ configSyncAction: () => ({}),
113
+ profileCreateAction: () => ({}),
114
+ };
115
+ export function fakeAdapterSet(overrides = {}) {
116
+ const release = createReleaseProbe();
117
+ const registry = createRegistryLookup();
118
+ const router = createPackageRouter({ manifestFile: 'fake-plugin.json', dshLookup: registry.registryDshOf });
119
+ const withRelease = {
120
+ ...supply,
121
+ latestVersion: release.latestVersion,
122
+ missingReleaseParts: release.missingReleaseParts,
123
+ probeRelease: release.probeRelease,
124
+ };
125
+ return {
126
+ apiVersion: ADAPTER_SET_API_VERSION,
127
+ id: 'fake-adapter-set',
128
+ version: '0.0.0',
129
+ data,
130
+ supply: {
131
+ ...withRelease,
132
+ ...modules,
133
+ env: withRelease,
134
+ modules,
135
+ registryDeclarationOf: registry.registryDeclarationOf,
136
+ packageRouteOf: router.packageRouteOf,
137
+ },
138
+ modules,
139
+ profile,
140
+ probe,
141
+ runtime: runtimePreset({
142
+ console: false,
143
+ pluginMarket: false,
144
+ browserBridge: false,
145
+ }),
146
+ plugins,
147
+ actions,
148
+ ...overrides,
149
+ };
150
+ }
@@ -7,7 +7,7 @@ export const fakeNpmSource = {
7
7
  export function extensionNeedOf(name, extra = {}) {
8
8
  return {
9
9
  kind: 'extension',
10
- runtime: 'opencli',
10
+ runtime: 'fake-runtime',
11
11
  name,
12
12
  commands: [`${name}-read`],
13
13
  purpose: '测试',
package/dist/testing.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './testing/host-fakes.js';
2
2
  export * from './testing/declaration.js';
3
3
  export * from './testing/needs.js';
4
4
  export * from './testing/data.js';
5
+ export * from './testing/fake-adapter-set.js';
package/dist/testing.js CHANGED
@@ -2,3 +2,4 @@ export * from './testing/host-fakes.js';
2
2
  export * from './testing/declaration.js';
3
3
  export * from './testing/needs.js';
4
4
  export * from './testing/data.js';
5
+ export * from './testing/fake-adapter-set.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/shared",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "工作台与模块共享的纯代码与契约类型:类型、纯逻辑、哑组件、平台解析。宿主侧的东西从 /host 进(不影响浏览器产物)。",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -313,3 +313,28 @@ describe('blockerOfCapability', () => {
313
313
  expect(blocker?.actions.map((action) => action.kind)).toEqual(['retry']);
314
314
  });
315
315
  });
316
+
317
+ describe('执行类失败的话术由适配器给', () => {
318
+ it('适配器给了 diagnose.exec 就用它,不再说默认那句', () => {
319
+ const blocker = blockerOfError(
320
+ { code: 'cli-exec-failed', message: '跑不起来' },
321
+ t,
322
+ { diagnose: { exec: '确认 MCP server 起得来:npx -y chrome-devtools-mcp@latest' } },
323
+ );
324
+ expect(blocker.hint).toBe('确认 MCP server 起得来:npx -y chrome-devtools-mcp@latest');
325
+ });
326
+
327
+ it('适配器没给就回词表那句(opencli 那份)', () => {
328
+ const blocker = blockerOfError({ code: 'cli-exec-failed', message: '跑不起来' }, t);
329
+ expect(blocker.hint).toBe('blocker.exec.hint');
330
+ });
331
+
332
+ it('错误自己带的 hint 优先级最高', () => {
333
+ const blocker = blockerOfError(
334
+ { code: 'cli-exec-failed', message: '跑不起来', hint: '端口被占了' },
335
+ t,
336
+ { diagnose: { exec: '确认 MCP server 起得来' } },
337
+ );
338
+ expect(blocker.hint).toBe('端口被占了');
339
+ });
340
+ });
@@ -1,6 +1,6 @@
1
1
  import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { API_PREFIX } from '../config/constants.js';
3
- import { apiGet } from './workbench-client.js';
2
+ import { API_PREFIX } from '../../config/constants.js';
3
+ import { apiGet } from '../workbench-client.js';
4
4
 
5
5
  interface FetchRecord {
6
6
  url: string;
@@ -22,7 +22,11 @@ function copyAction(t: Translate, text: string): BlockerAction {
22
22
  export function blockerOfError(
23
23
  error: ApiError | undefined,
24
24
  t: Translate,
25
- context: { path?: string | null; platform?: string } = {},
25
+ context: {
26
+ path?: string | null;
27
+ platform?: string;
28
+ diagnose?: Readonly<Partial<Record<'exec' | 'login' | 'bridge', string>>>;
29
+ } = {},
26
30
  ): ModuleBlocker {
27
31
  if (error === undefined) {
28
32
  return {
@@ -93,7 +97,7 @@ export function blockerOfError(
93
97
  id: 'cli-exec-failed',
94
98
  severity: 'block',
95
99
  title: error.message,
96
- hint: error.hint ?? t('blocker.exec.hint'),
100
+ hint: error.hint ?? context.diagnose?.exec ?? t('blocker.exec.hint'),
97
101
  ...(error.detail === undefined ? {} : { detail: error.detail }),
98
102
  actions: [retryAction(t)],
99
103
  };
@@ -70,12 +70,6 @@
70
70
  justify-content: center;
71
71
  }
72
72
 
73
- .wb-selectReveal {
74
- display: inline-flex;
75
- align-items: center;
76
- justify-content: center;
77
- }
78
-
79
73
  .wb-selectIconOnly .wb-selectIcon {
80
74
  width: 100%;
81
75
  height: 100%;