@dsh-workbench/shared 0.3.11 → 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 (403) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/api/blocker-table.d.ts +3 -3
  4. package/dist/api/blocker-table.js +47 -23
  5. package/dist/api/dsh.d.ts +1 -1
  6. package/dist/api/workbench-client.js +2 -1
  7. package/dist/components/Activity.css +0 -1
  8. package/dist/components/ApprovalDetail.css +1 -2
  9. package/dist/components/ApprovalDetail.d.ts +1 -1
  10. package/dist/components/ApprovalPlan.css +0 -1
  11. package/dist/components/Card.css +0 -1
  12. package/dist/components/Card.d.ts +1 -1
  13. package/dist/components/CardBoundary.d.ts +1 -1
  14. package/dist/components/CardHead.css +0 -1
  15. package/dist/components/CardHead.d.ts +1 -1
  16. package/dist/components/ChoiceGroup.css +1 -2
  17. package/dist/components/ConfirmBar.d.ts +1 -1
  18. package/dist/components/ConfirmBar.js +1 -1
  19. package/dist/components/Form.css +1 -1
  20. package/dist/components/FormActions.js +1 -1
  21. package/dist/components/FormNodes.js +5 -1
  22. package/dist/components/FormRows.css +1 -0
  23. package/dist/components/FormRows.d.ts +4 -2
  24. package/dist/components/FormRows.js +5 -4
  25. package/dist/components/LongTaskRow.css +1 -2
  26. package/dist/components/LongTaskRow.d.ts +1 -1
  27. package/dist/components/LongTaskRow.js +1 -1
  28. package/dist/components/Note.css +0 -1
  29. package/dist/components/ResourceStates.css +0 -1
  30. package/dist/components/SettingsSection.css +0 -1
  31. package/dist/components/Spinner.css +0 -1
  32. package/dist/components/Stack.css +0 -1
  33. package/dist/components/StateBlock.css +0 -1
  34. package/dist/components/board-module.d.ts +3 -3
  35. package/dist/components/icons.d.ts +1 -1
  36. package/dist/components/icons.js +11 -4
  37. package/dist/config/constants.d.ts +2 -4
  38. package/dist/config/constants.js +2 -7
  39. package/dist/contract/adapters.d.ts +10 -0
  40. package/dist/contract/cli.d.ts +3 -0
  41. package/dist/contract/command.d.ts +22 -0
  42. package/dist/contract/data.d.ts +127 -0
  43. package/dist/contract/extension.d.ts +14 -0
  44. package/dist/contract/extension.js +1 -0
  45. package/dist/{api → contract}/facts.d.ts +12 -3
  46. package/dist/{api → contract}/facts.js +19 -1
  47. package/dist/contract/git.d.ts +38 -0
  48. package/dist/contract/git.js +1 -0
  49. package/dist/contract/lib.d.ts +4 -0
  50. package/dist/contract/lib.js +1 -0
  51. package/dist/contract/needs.d.ts +132 -0
  52. package/dist/contract/needs.js +232 -0
  53. package/dist/contract/plugin-source.d.ts +1 -0
  54. package/dist/contract/plugin-source.js +1 -0
  55. package/dist/contract/protocol/bundle-install.d.ts +136 -0
  56. package/dist/contract/protocol/bundle-install.js +12 -0
  57. package/dist/contract/protocol/config-sync.d.ts +55 -0
  58. package/dist/contract/protocol/config-sync.js +2 -0
  59. package/dist/contract/protocol/diy.d.ts +4 -0
  60. package/dist/contract/protocol/diy.js +4 -0
  61. package/dist/contract/protocol/dsh-plugins.d.ts +11 -0
  62. package/dist/contract/protocol/dsh-plugins.js +1 -0
  63. package/dist/contract/protocol/long-tasks.d.ts +13 -0
  64. package/dist/contract/protocol/long-tasks.js +1 -0
  65. package/dist/contract/protocol/market-index.d.ts +195 -0
  66. package/dist/contract/protocol/market-index.js +7 -0
  67. package/dist/contract/protocol/platform.d.ts +44 -0
  68. package/dist/contract/protocol/platform.js +1 -0
  69. package/dist/contract/protocol/preflight-wake.d.ts +7 -0
  70. package/dist/contract/protocol/preflight-wake.js +1 -0
  71. package/dist/contract/protocol/profile-create.d.ts +30 -0
  72. package/dist/contract/protocol/profile-create.js +2 -0
  73. package/dist/contract/protocol/sidebar-edition.d.ts +14 -0
  74. package/dist/contract/protocol/sidebar-edition.js +2 -0
  75. package/dist/contract/protocol/unit-manifests.d.ts +6 -0
  76. package/dist/contract/protocol/unit-manifests.js +1 -0
  77. package/dist/contract/unit-board.js +1 -0
  78. package/dist/contract/unit-capability.d.ts +34 -0
  79. package/dist/contract/unit-capability.js +1 -0
  80. package/dist/{host → contract}/unit-declaration.d.ts +7 -5
  81. package/dist/{api → contract}/unit-declaration.js +19 -13
  82. package/dist/contract/unit.d.ts +57 -0
  83. package/dist/contract/unit.js +24 -0
  84. package/dist/contract/workbench-contract.d.ts +15 -0
  85. package/dist/contract/workbench-contract.js +1 -0
  86. package/dist/host/adapter-set.d.ts +26 -0
  87. package/dist/host/adapter-set.js +244 -0
  88. package/dist/host/adapter-types.d.ts +79 -0
  89. package/dist/host/adapter-types.js +23 -0
  90. package/dist/host/adapters.d.ts +28 -0
  91. package/dist/host/adapters.js +9 -0
  92. package/dist/host/browser.d.ts +3 -0
  93. package/dist/host/browser.js +3 -0
  94. package/dist/host/changelog.d.ts +21 -0
  95. package/dist/host/changelog.js +188 -0
  96. package/dist/host/channel-plugin.d.ts +15 -0
  97. package/dist/host/channel-plugin.js +42 -0
  98. package/dist/host/cli.d.ts +4 -0
  99. package/dist/host/cli.js +7 -0
  100. package/dist/host/command-name.d.ts +1 -0
  101. package/dist/host/command-name.js +14 -0
  102. package/dist/host/data-error.d.ts +13 -0
  103. package/dist/host/data-error.js +20 -0
  104. package/dist/host/data-root.js +3 -0
  105. package/dist/host/diy-debug.js +2 -1
  106. package/dist/host/diy-record.js +2 -1
  107. package/dist/host/extension.d.ts +7 -0
  108. package/dist/host/extension.js +39 -0
  109. package/dist/host/facts.d.ts +1 -1
  110. package/dist/host/facts.js +3 -2
  111. package/dist/host/git.d.ts +2 -33
  112. package/dist/host/git.js +2 -2
  113. package/dist/host/http.js +2 -2
  114. package/dist/host/lib-capabilities.d.ts +22 -0
  115. package/dist/host/lib-capabilities.js +37 -0
  116. package/dist/host/lib-install.d.ts +9 -0
  117. package/dist/host/lib-install.js +10 -0
  118. package/dist/host/long-task.d.ts +1 -1
  119. package/dist/host/long-task.js +4 -3
  120. package/dist/host/market-index.d.ts +22 -0
  121. package/dist/host/market-index.js +379 -0
  122. package/dist/host/needs.d.ts +4 -0
  123. package/dist/host/needs.js +2 -0
  124. package/dist/host/patch.d.ts +9 -0
  125. package/dist/host/patch.js +78 -0
  126. package/dist/host/paths.d.ts +12 -0
  127. package/dist/host/paths.js +28 -0
  128. package/dist/host/platform.d.ts +14 -0
  129. package/dist/host/platform.js +40 -0
  130. package/dist/host/plugin-source.d.ts +8 -6
  131. package/dist/host/plugin-source.js +43 -33
  132. package/dist/host/plugin.d.ts +4 -0
  133. package/dist/host/plugin.js +39 -0
  134. package/dist/host/port-types.d.ts +192 -0
  135. package/dist/host/port-types.js +1 -0
  136. package/dist/host/preflight.d.ts +28 -0
  137. package/dist/host/preflight.js +1 -0
  138. package/dist/host/profile-port.d.ts +4 -0
  139. package/dist/host/profile-port.js +4 -0
  140. package/dist/host/provision.d.ts +2 -2
  141. package/dist/host/provision.js +5 -3
  142. package/dist/host/recipe-rules.d.ts +5 -0
  143. package/dist/host/recipe-rules.js +382 -0
  144. package/dist/host/recipe.d.ts +14 -0
  145. package/dist/host/recipe.js +283 -0
  146. package/dist/host/release-packages.generated.d.ts +1 -0
  147. package/dist/host/release-packages.generated.js +10 -0
  148. package/dist/host/shell-text.d.ts +9 -2
  149. package/dist/host/shell-text.js +15 -3
  150. package/dist/host/shell.d.ts +2 -0
  151. package/dist/host/shell.js +7 -0
  152. package/dist/host/spec.d.ts +8 -0
  153. package/dist/host/spec.js +24 -0
  154. package/dist/host/supply-index.d.ts +34 -0
  155. package/dist/host/supply-index.js +202 -0
  156. package/dist/host/supply-port.d.ts +5 -0
  157. package/dist/host/supply-port.js +39 -0
  158. package/dist/host/time.d.ts +12 -0
  159. package/dist/host/time.js +19 -0
  160. package/dist/host/tokens.d.ts +26 -0
  161. package/dist/host/tokens.js +154 -0
  162. package/dist/host/tool-kit.d.ts +0 -6
  163. package/dist/host/tool-kit.js +0 -22
  164. package/dist/host/unit-face.d.ts +12 -4
  165. package/dist/host/version-range.d.ts +2 -0
  166. package/dist/host/version-range.js +13 -0
  167. package/dist/host/version.d.ts +4 -0
  168. package/dist/host/version.js +27 -0
  169. package/dist/host.d.ts +53 -16
  170. package/dist/host.js +53 -16
  171. package/dist/i18n/en.js +225 -71
  172. package/dist/i18n/index.d.ts +299 -73
  173. package/dist/i18n/merge.js +1 -1
  174. package/dist/i18n/need-text.d.ts +26 -0
  175. package/dist/i18n/need-text.js +26 -0
  176. package/dist/i18n/settings.d.ts +70 -0
  177. package/dist/i18n/settings.js +136 -0
  178. package/dist/i18n/zh.d.ts +298 -72
  179. package/dist/i18n/zh.js +227 -73
  180. package/dist/index.d.ts +27 -7
  181. package/dist/index.js +27 -7
  182. package/dist/{api → lib}/dsh-client.d.ts +11 -1
  183. package/dist/lib/dsh-client.js +1 -0
  184. package/dist/lib/market-index.d.ts +7 -0
  185. package/dist/lib/market-index.js +25 -0
  186. package/dist/lib/react.d.ts +0 -40
  187. package/dist/lib/react.js +0 -36
  188. package/dist/lib/ui.js +3 -9
  189. package/dist/lib/version.d.ts +4 -0
  190. package/dist/lib/version.js +21 -0
  191. package/dist/testing/data.d.ts +13 -0
  192. package/dist/testing/data.js +46 -0
  193. package/dist/testing/declaration.d.ts +1 -1
  194. package/dist/testing/declaration.js +1 -1
  195. package/dist/testing/host-fakes.d.ts +0 -13
  196. package/dist/testing/host-fakes.js +0 -24
  197. package/dist/testing/needs.d.ts +16 -0
  198. package/dist/testing/needs.js +46 -0
  199. package/dist/testing.d.ts +2 -0
  200. package/dist/testing.js +2 -0
  201. package/package.json +22 -4
  202. package/src/api/__tests__/blocker-table.test.ts +135 -86
  203. package/src/api/blocker-table.ts +52 -26
  204. package/src/api/dsh.ts +1 -1
  205. package/src/api/host-write.ts +0 -1
  206. package/src/api/workbench-client.test.ts +2 -2
  207. package/src/api/workbench-client.ts +2 -1
  208. package/src/components/Activity.css +0 -1
  209. package/src/components/ApprovalDetail.css +1 -2
  210. package/src/components/ApprovalDetail.tsx +1 -1
  211. package/src/components/ApprovalPlan.css +0 -1
  212. package/src/components/Card.css +0 -1
  213. package/src/components/Card.tsx +1 -1
  214. package/src/components/CardAnchor.test.tsx +1 -1
  215. package/src/components/CardBoundary.tsx +1 -1
  216. package/src/components/CardHead.css +0 -1
  217. package/src/components/CardHead.tsx +1 -1
  218. package/src/components/ChoiceGroup.css +1 -2
  219. package/src/components/ConfirmBar.tsx +1 -1
  220. package/src/components/Form.css +1 -1
  221. package/src/components/Form.test.tsx +6 -0
  222. package/src/components/Form.tsx +1 -1
  223. package/src/components/FormActions.tsx +1 -1
  224. package/src/components/FormNodes.tsx +6 -1
  225. package/src/components/FormRows.css +1 -0
  226. package/src/components/FormRows.test.tsx +30 -0
  227. package/src/components/FormRows.tsx +9 -5
  228. package/src/components/LongTaskRow.css +1 -2
  229. package/src/components/LongTaskRow.tsx +1 -1
  230. package/src/components/Note.css +0 -1
  231. package/src/components/ResourceStates.css +0 -1
  232. package/src/components/SelectFieldNodes.tsx +0 -1
  233. package/src/components/SettingsSection.css +0 -1
  234. package/src/components/Spinner.css +0 -1
  235. package/src/components/Stack.css +0 -1
  236. package/src/components/StateBlock.css +0 -1
  237. package/src/components/__tests__/long-task-row.test.ts +1 -1
  238. package/src/components/board-module.ts +3 -3
  239. package/src/components/icons.tsx +16 -8
  240. package/src/config/constants.ts +2 -8
  241. package/src/{api → contract}/__tests__/facts.test.ts +73 -25
  242. package/src/{api → contract}/__tests__/long-task.test.ts +3 -3
  243. package/src/contract/__tests__/needs.test.ts +74 -0
  244. package/src/{host → contract}/__tests__/unit-declaration.test.ts +1 -1
  245. package/src/contract/__tests__/unit.test.ts +43 -0
  246. package/src/contract/adapters.ts +9 -0
  247. package/src/contract/cli.ts +3 -0
  248. package/src/contract/command.ts +25 -0
  249. package/src/contract/data.ts +146 -0
  250. package/src/contract/extension.ts +20 -0
  251. package/src/{api → contract}/facts.ts +34 -4
  252. package/src/contract/git.ts +20 -0
  253. package/src/contract/lib.ts +5 -0
  254. package/src/contract/needs.ts +331 -0
  255. package/src/contract/plugin-source.ts +1 -0
  256. package/src/contract/protocol/bundle-install.ts +198 -0
  257. package/src/contract/protocol/config-sync.ts +65 -0
  258. package/src/contract/protocol/diy.ts +4 -0
  259. package/src/contract/protocol/dsh-plugins.ts +13 -0
  260. package/src/contract/protocol/long-tasks.ts +16 -0
  261. package/src/contract/protocol/market-index.ts +246 -0
  262. package/src/contract/protocol/platform.ts +47 -0
  263. package/src/contract/protocol/preflight-wake.ts +17 -0
  264. package/src/contract/protocol/profile-create.ts +36 -0
  265. package/src/contract/protocol/sidebar-edition.ts +19 -0
  266. package/src/contract/protocol/unit-manifests.ts +8 -0
  267. package/src/{api → contract}/unit-board.ts +0 -1
  268. package/src/contract/unit-capability.ts +37 -0
  269. package/src/{host → contract}/unit-declaration.ts +22 -18
  270. package/src/contract/unit.ts +76 -0
  271. package/src/contract/workbench-contract.ts +30 -0
  272. package/src/host/__tests__/adapter-set.test.ts +228 -0
  273. package/src/host/__tests__/adapters.test.ts +27 -0
  274. package/src/host/__tests__/changelog.test.ts +102 -0
  275. package/src/host/__tests__/command-name.test.ts +16 -0
  276. package/src/host/__tests__/diy-record.test.ts +3 -3
  277. package/src/host/__tests__/facts.test.ts +5 -5
  278. package/src/host/__tests__/long-task.test.ts +1 -1
  279. package/src/host/__tests__/market-index.test.ts +179 -0
  280. package/src/host/__tests__/plugin-ledger.test.ts +10 -10
  281. package/src/host/__tests__/provision.test.ts +7 -6
  282. package/src/host/__tests__/shell-text.test.ts +16 -1
  283. package/src/host/__tests__/supply-index.test.ts +137 -0
  284. package/src/host/__tests__/tokens.test.ts +110 -0
  285. package/src/host/__tests__/version-range.test.ts +21 -0
  286. package/src/host/adapter-set.ts +299 -0
  287. package/src/host/adapter-types.ts +105 -0
  288. package/src/host/adapters.ts +50 -0
  289. package/src/host/browser.ts +3 -0
  290. package/src/host/changelog.ts +212 -0
  291. package/src/host/channel-plugin.ts +55 -0
  292. package/src/host/cli.ts +11 -0
  293. package/src/host/command-name.ts +15 -0
  294. package/src/host/data-error.ts +21 -0
  295. package/src/host/data-root.ts +2 -0
  296. package/src/host/diy-debug.ts +2 -1
  297. package/src/host/diy-record.ts +2 -1
  298. package/src/host/extension.test.ts +55 -0
  299. package/src/host/extension.ts +57 -0
  300. package/src/host/facts.ts +4 -3
  301. package/src/host/git.ts +8 -16
  302. package/src/host/http.ts +2 -2
  303. package/src/host/lib-capabilities.ts +52 -0
  304. package/src/host/lib-install.ts +18 -0
  305. package/src/host/long-task.ts +4 -3
  306. package/src/host/market-index.ts +383 -0
  307. package/src/host/needs.ts +6 -0
  308. package/src/host/patch.ts +93 -0
  309. package/src/host/paths.ts +37 -0
  310. package/src/host/platform.ts +48 -0
  311. package/src/host/plugin-source.ts +48 -56
  312. package/src/host/plugin.ts +39 -0
  313. package/src/host/port-types.ts +223 -0
  314. package/src/host/preflight.ts +31 -0
  315. package/src/host/profile-port.ts +9 -0
  316. package/src/host/provision.ts +7 -4
  317. package/src/host/recipe-rules.ts +330 -0
  318. package/src/host/recipe.test.ts +334 -0
  319. package/src/host/recipe.ts +323 -0
  320. package/src/host/release-packages.generated.ts +10 -0
  321. package/src/host/shell-text.ts +15 -3
  322. package/src/host/shell.ts +9 -0
  323. package/src/host/spec.ts +32 -0
  324. package/src/host/supply-index.ts +256 -0
  325. package/src/host/supply-port.ts +45 -0
  326. package/src/host/time.ts +22 -0
  327. package/src/host/tokens.ts +186 -0
  328. package/src/host/tool-kit.ts +0 -35
  329. package/src/host/unit-face.ts +12 -4
  330. package/src/host/version-range.ts +13 -0
  331. package/src/host/version.ts +30 -0
  332. package/src/host.ts +53 -16
  333. package/src/i18n/en.ts +225 -71
  334. package/src/i18n/merge.test.ts +6 -6
  335. package/src/i18n/merge.ts +1 -1
  336. package/src/i18n/need-text.ts +27 -0
  337. package/src/i18n/settings.ts +141 -0
  338. package/src/i18n/zh.ts +228 -73
  339. package/src/index.ts +27 -7
  340. package/src/lib/blocker-action.ts +0 -1
  341. package/src/{api → lib}/dsh-client.ts +12 -1
  342. package/src/lib/market-index.ts +36 -0
  343. package/src/lib/react.ts +0 -40
  344. package/src/lib/text.test.ts +2 -2
  345. package/src/lib/ui.test.ts +6 -5
  346. package/src/lib/ui.ts +3 -9
  347. package/src/testing/__tests__/declaration.test.ts +1 -1
  348. package/src/testing/data.ts +66 -0
  349. package/src/testing/declaration.ts +2 -2
  350. package/src/testing/host-fakes.ts +0 -38
  351. package/src/testing/needs.ts +80 -0
  352. package/src/testing.ts +2 -0
  353. package/dist/api/unit-declaration.d.ts +0 -65
  354. package/dist/api/unit.d.ts +0 -85
  355. package/dist/api/unit.js +0 -8
  356. package/dist/api/workbench-contract.d.ts +0 -44
  357. package/dist/components/MockStrip.css +0 -39
  358. package/dist/components/MockStrip.d.ts +0 -15
  359. package/dist/components/MockStrip.js +0 -8
  360. package/dist/components/SaveBar.css +0 -7
  361. package/dist/host/browser-find.d.ts +0 -38
  362. package/dist/host/browser-find.js +0 -242
  363. package/dist/host/browser-read.d.ts +0 -28
  364. package/dist/host/browser-read.js +0 -243
  365. package/dist/host/opencli-runtime.d.ts +0 -25
  366. package/dist/host/opencli-runtime.js +0 -56
  367. package/dist/host/opencli-window.d.ts +0 -2
  368. package/dist/host/opencli-window.js +0 -8
  369. package/dist/host/opencli.d.ts +0 -37
  370. package/dist/host/opencli.js +0 -155
  371. package/dist/host/unit-declaration.js +0 -213
  372. package/dist/host/unit-libs.d.ts +0 -37
  373. package/dist/lib/diy-debug.d.ts +0 -80
  374. package/dist/lib/diy-debug.js +0 -88
  375. package/dist/lib/diy-record.d.ts +0 -135
  376. package/dist/lib/diy-record.js +0 -162
  377. package/dist/lib/lint-probe.d.ts +0 -1
  378. package/dist/lib/lint-probe.js +0 -6
  379. package/dist/lib/panel-state.d.ts +0 -120
  380. package/dist/lib/panel-state.js +0 -176
  381. package/src/api/__tests__/unit.test.ts +0 -38
  382. package/src/api/unit.ts +0 -93
  383. package/src/api/workbench-contract.ts +0 -59
  384. package/src/host/__tests__/browser-find.test.ts +0 -330
  385. package/src/host/__tests__/browser-read.test.ts +0 -228
  386. package/src/host/__tests__/opencli-runtime.test.ts +0 -46
  387. package/src/host/browser-find.ts +0 -311
  388. package/src/host/browser-read.ts +0 -311
  389. package/src/host/opencli-runtime.ts +0 -79
  390. package/src/host/opencli-window.ts +0 -11
  391. package/src/host/opencli.ts +0 -213
  392. package/src/host/unit-libs.ts +0 -41
  393. /package/dist/{api/blocker.js → contract/adapters.js} +0 -0
  394. /package/dist/{api → contract}/blocker.d.ts +0 -0
  395. /package/dist/{api/dsh-client.js → contract/blocker.js} +0 -0
  396. /package/dist/{api/unit-board.js → contract/cli.js} +0 -0
  397. /package/dist/{api/workbench-contract.js → contract/command.js} +0 -0
  398. /package/dist/{host/unit-libs.js → contract/data.js} +0 -0
  399. /package/dist/{api → contract}/long-task.d.ts +0 -0
  400. /package/dist/{api → contract}/long-task.js +0 -0
  401. /package/dist/{api → contract}/unit-board.d.ts +0 -0
  402. /package/src/{api → contract}/blocker.ts +0 -0
  403. /package/src/{api → contract}/long-task.ts +0 -0
package/src/i18n/en.ts CHANGED
@@ -1,7 +1,10 @@
1
+ import { enSettings } from './settings.js';
2
+ import { enNeedText } from './need-text.js';
1
3
  import type { WorkbenchMessages } from './zh.js';
2
4
 
3
5
  /** 外壳自带的英文词表:键必须与 `zh` 逐一对应,值不许为空串。 */
4
6
  export const en: Record<keyof WorkbenchMessages, string> = {
7
+ ...enSettings,
5
8
  'brand.name': 'Workbench',
6
9
 
7
10
  'toggle.open': 'Open sidebar',
@@ -24,7 +27,7 @@ export const en: Record<keyof WorkbenchMessages, string> = {
24
27
  'project.rename.title': 'Give “{name}” a display name',
25
28
  'project.rename.description': 'Shown after the folder name. It renames the workspace itself.',
26
29
  'project.rename.field': 'Display name',
27
- 'project.rename.placeholder': 'e.g. Workbench shell',
30
+ 'project.rename.placeholder': 'e.g. My workbench',
28
31
  'project.rename.hint': 'Empty = folder name only',
29
32
  'project.rename.save': 'Save',
30
33
  'project.rename.saving': 'Saving…',
@@ -96,9 +99,11 @@ export const en: Record<keyof WorkbenchMessages, string> = {
96
99
  'panels.labelWithHint': '{label} ({hint})',
97
100
  'panels.hintJoin': '; ',
98
101
  'panels.dep.failed': '⚠ failed to start',
99
- 'panels.dep.missingPlugin': '⚠ not ready yet',
100
- 'panels.dep.missingCommands': '⚠ needs an update',
101
102
  'panels.dep.unchecked': '⚠ cannot check',
103
+ 'panels.dep.missing': '⚠ missing a dependency',
104
+ 'panels.dep.outdated': '⚠ needs an update',
105
+ 'panels.dep.degraded': '⚠ an optional item is missing',
106
+ 'panels.dep.unsupported': '⚠ needs a newer workbench',
102
107
  'panels.tab.modules': 'Panel setup',
103
108
  'panels.tab.market': 'Workbench module market',
104
109
  'panels.browseMarket': 'Browse the module market',
@@ -110,11 +115,12 @@ export const en: Record<keyof WorkbenchMessages, string> = {
110
115
  'panels.market.broken': 'broken',
111
116
  'panels.market.hasNew': 'New version',
112
117
  'panels.market.hasProblem': 'Module problem',
113
- 'panels.market.missing': 'not installed',
118
+ 'panels.market.missing': 'missing dependency',
114
119
  'panels.market.unchecked': 'unknown',
120
+ 'panels.market.uncheckedHint': 'restart the workbench and try again',
115
121
  'panels.market.checking': 'checking',
116
122
  'panels.market.sectionInstalled': 'Installed modules',
117
- 'panels.market.sectionPending': 'Not installed',
123
+ 'panels.market.sectionPending': 'Not ready',
118
124
  'panels.market.sectionShared': 'Shared dependencies',
119
125
  'panels.market.sharedUsedBy': 'Used by module {modules}',
120
126
  'panels.market.listSeparator': ', ',
@@ -124,9 +130,10 @@ export const en: Record<keyof WorkbenchMessages, string> = {
124
130
  'panels.market.sharedOk': 'ready',
125
131
  'panels.market.versionArrow': '{from} → {to}',
126
132
  'panels.market.lead': 'Installed on this machine, shared by every project.',
127
- 'panels.market.install': 'Install',
133
+ 'panels.market.install': 'Install dependency',
128
134
  'panels.market.update': 'Update',
129
135
  'panels.market.swapSlow': 'Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.',
136
+ 'panels.market.removeSlow': 'Not removed yet — maybe a slow network or an uninstall that did not finish. Check again in a moment; if it stays like this, restart dsh.',
130
137
  'panels.market.updateNoChange': 'Not updated: you were on {from}, and after the run the disk still has that version; the newest on the registry is {latest}.',
131
138
  'panels.market.updateUnknownVersion': '(unknown)',
132
139
  'panels.market.updateGone': 'Not updated: after the run the module cannot be read from disk.',
@@ -150,23 +157,18 @@ export const en: Record<keyof WorkbenchMessages, string> = {
150
157
  'panels.market.failed': 'Failed: {reason}',
151
158
  'panels.market.needEnv': 'Set {env} in the terminal that started the workbench first',
152
159
  'panels.market.needCommands': 'Missing commands: {commands}',
160
+ 'panels.market.needBinary': 'Install the {command} command first',
161
+ 'panels.market.needLib': 'Install the shared dependency {name} first',
153
162
  'panels.market.localMark': 'local',
154
- 'panels.market.localHint': 'This is your machine’s own copy (not taken from the registry).',
155
163
  'panels.market.noSource': 'This module declares no install method — install it yourself',
156
164
  'panels.market.badSource': 'The install method is incomplete — install it yourself',
157
165
  'panels.market.empty': 'No modules available',
158
166
  'panels.market.sectionPlugins': 'Installed opencli plugins',
159
167
  'panels.market.moduleOutdated': 'update available',
160
168
  'panels.market.moduleRefused': 'This module does not match this workbench, so it cannot be used for now.',
161
- 'panels.market.moduleRefusedDetail': 'Why it cannot be used: {reason}',
162
169
  'panels.market.moduleRestartHint': 'restart dsh once to bring it up',
163
170
  'panels.market.pendingRestart': 'restart required',
164
171
  'panels.market.workbenchName': 'Workbench',
165
- 'panels.market.workbenchLocal': 'This is the copy from your working repository; it does not come from the registry.',
166
- 'panels.market.pluginKeptInUse': 'Files kept for now: {names} still uses it.',
167
- 'panels.market.pluginKeptUnsure': 'Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.',
168
- 'panels.market.pluginKeptHeld': 'Files kept: this one is yours, and a module letting go will not remove it.',
169
- 'panels.market.pluginKeptUnnamed': 'Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.',
170
172
  'panels.market.pluginBroken': 'This plugin install is broken: it cannot be identified. Uninstall it first, then ask the agent to reinstall it by package name.',
171
173
  'panels.market.restartNeeded': 'The new version is installed — restart once to pick it up.',
172
174
  'panels.market.foot': 'After installing, enable it in the panel page of that project.',
@@ -269,6 +271,143 @@ export const en: Record<keyof WorkbenchMessages, string> = {
269
271
  'panels.market.add.close': 'Close',
270
272
  'panels.market.add.retry': 'Retry',
271
273
  'panels.market.add.changeSource': 'Change source',
274
+ 'panels.market.tabInstalled': 'Installed',
275
+ 'panels.market.tabs': 'The two faces of the module market',
276
+ 'panels.tab.discover': 'Discover',
277
+ 'panels.discover.loading': 'Reading the index',
278
+ 'panels.discover.lead': 'Browse modules from an index source; install and go.',
279
+ 'panels.discover.addSource': 'Add',
280
+ 'panels.discover.addingSource': 'Adding…',
281
+ 'panels.discover.addFirstSource': 'Add index source',
282
+ 'panels.discover.removeSource': 'Remove',
283
+ 'panels.discover.removeSourceNamed': 'Remove {url}',
284
+ 'panels.discover.refresh': 'Refresh',
285
+ 'panels.discover.search': 'Search modules',
286
+ 'panels.discover.all': 'All',
287
+ 'panels.discover.sourceLabel': 'Name',
288
+ 'panels.discover.sourceKind': 'Type',
289
+ 'panels.discover.sourceKindHttp': 'http address',
290
+ 'panels.discover.sourceKindGit': 'git repository',
291
+ 'panels.discover.sourceUrl': 'Index URL',
292
+ 'panels.discover.sourcePlaceholder': 'https://example.com/index.json or git@git.example.com:wb/market.git',
293
+ 'panels.discover.sourceRef': 'Branch',
294
+ 'panels.discover.sourcePath': 'Index file',
295
+ 'panels.discover.sourceLocal': 'Local clone (optional)',
296
+ 'panels.discover.sourceLocalHint': 'Leave empty to clone into ~/.dsh/workbench/market-index/.',
297
+ 'panels.discover.save': 'Save and refresh',
298
+ 'panels.discover.cancel': 'Cancel',
299
+ 'panels.discover.retry': 'Retry',
300
+ 'panels.discover.noSource': 'No module market yet',
301
+ 'panels.discover.noSourceHint': 'Add a module market index (http address or git repository) to browse and install its modules here',
302
+ 'panels.discover.sourcesFailed': 'Could not read the index sources.',
303
+ 'panels.discover.unreadable': 'Could not read this index.',
304
+ 'panels.discover.invalid': 'This index is not in a valid format.',
305
+ 'panels.discover.emptyRepo': 'This repository has no commits yet.',
306
+ 'panels.discover.missingIndex': 'This repository has no {path} yet.',
307
+ 'panels.discover.initTitle': 'Initialize this repository as a module market index?',
308
+ 'panels.discover.initCta': 'Initialize market index',
309
+ 'panels.discover.initWhat': 'It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their artifacts under packages/<unit>/. The repository stays owned by its owner.',
310
+ 'panels.discover.initBranch': 'Branch',
311
+ 'panels.discover.initBranchHint': 'The index and artifacts go to this branch; an empty repository gets it created.',
312
+ 'panels.discover.initBranchBad': 'Use only letters, digits, dots, underscores, slashes, or dashes in a branch name.',
313
+ 'panels.discover.initOk': 'Initialize',
314
+ 'panels.discover.initBusy': 'Initializing…',
315
+ 'panels.discover.initDone': 'Market index initialized ({branch})',
316
+ 'panels.discover.stale': 'Cannot read the latest; showing the last good cache.',
317
+ 'panels.discover.empty': 'This index lists no modules.',
318
+ 'panels.discover.noMatch': 'No modules match.',
319
+ 'panels.discover.notInstalled': 'Not installed',
320
+ 'panels.discover.installed': 'Installed',
321
+ 'panels.discover.installedVersion': 'Installed {version}',
322
+ 'panels.discover.update': 'Update available',
323
+ 'panels.discover.badShell': 'Not installable',
324
+ 'panels.discover.badShellDetail': 'This version is not compatible with the running workbench {current}; it requires {peer}',
325
+ 'panels.discover.unverified': 'Workbench unverified',
326
+ 'panels.discover.installing': 'Installing…',
327
+ 'panels.discover.installedDone': 'Installed: {name}',
328
+ 'panels.discover.failed': 'Failed: {reason}',
329
+ 'panels.discover.expand': 'Show versions',
330
+ 'panels.discover.collapse': 'Hide versions',
331
+ 'panels.discover.versionCount': '{n} versions',
332
+ 'panels.discover.sourceNpm': 'npm · {registry}',
333
+ 'panels.discover.sourceNpmDefault': 'default registry',
334
+ 'panels.discover.sourceGit': 'git · {commit}',
335
+ 'panels.discover.installVersion': 'Install {version}',
336
+ 'panels.discover.confirmTitle': 'Install "{name}"?',
337
+ 'panels.discover.confirmDetail': 'Source: {source}. The index is a teammate-maintained catalog, not a signed official feed; installing a different version replaces the current one.',
338
+ 'panels.discover.confirmAck': 'I understand this is not an official source',
339
+ 'panels.discover.confirmOk': 'Install',
340
+ 'panels.discover.confirmCancel': 'Cancel',
341
+ 'panels.discover.marketMenu': 'Switch module market, currently {market}',
342
+ 'panels.discover.manageSources': 'Manage index sources…',
343
+ 'panels.discover.sourcesTitle': 'Index sources',
344
+ 'panels.discover.sourcesIntro': 'A module market is published as the URL of one index file, either an http(s) address or a git repository. Discover browses the indexes listed here.',
345
+ 'panels.discover.sourcesLabel': 'Added index sources',
346
+ 'panels.discover.sourceTrust': 'Indexes come from third parties. Add only sources you trust: their modules run with your permissions once installed.',
347
+ 'panels.discover.sourceDuplicate': 'This index source is already added.',
348
+ 'panels.discover.sourceBadUrl': 'Use an http(s) or git repository address without a user name, password, or # fragment',
349
+ 'panels.discover.close': 'Close',
350
+ 'panels.discover.labelsMenu': 'Labels',
351
+ 'panels.discover.labelsCount': 'Labels · {count}',
352
+ 'panels.discover.tagsAll': 'All labels',
353
+ 'panels.discover.sort': 'Sort',
354
+ 'panels.discover.sortWith': 'Sort: {label}',
355
+ 'panels.discover.sortRelevance': 'Best match',
356
+ 'panels.discover.sortDefault': 'Default order',
357
+ 'panels.discover.sortPublished': 'Publish date',
358
+ 'panels.discover.categoriesLabel': 'Categories',
359
+ 'panels.discover.showMore': 'Show more',
360
+ 'panels.discover.entryMeta': '{version} · {date}',
361
+ 'panels.discover.entryMetaAuthor': '{version} · {author} · {date}',
362
+ 'panels.discover.openEntry': 'View {name}',
363
+ 'panels.discover.cardInstall': 'Install',
364
+ 'panels.discover.cardInstalled': 'Installed',
365
+ 'panels.discover.cardUpdate': 'Update available',
366
+ 'panels.discover.cardBlocked': 'No usable version',
367
+ 'panels.discover.installTitle': 'Install {name}',
368
+ 'panels.discover.installVersionTitle': 'Install {name} {version}',
369
+ 'panels.discover.openInstalled': 'View {name} in Installed',
370
+ 'panels.discover.noCompatibleVersion': 'No version is compatible with workbench {runtime}',
371
+ 'panels.discover.detailBack': 'Discover',
372
+ 'panels.discover.publishedAt': 'Published {date}',
373
+ 'panels.discover.detailMarket': 'Index source {label}',
374
+ 'panels.discover.detailIncompatible': 'Needs workbench {peer}; this one is {current}',
375
+ 'panels.discover.detailUnknown': 'Workbench compatibility is unverified: the index has no readable package.json.',
376
+ 'panels.discover.detailSource': 'Source',
377
+ 'panels.discover.authorUnknown': 'Unattributed',
378
+ 'panels.discover.tabOverview': 'Overview',
379
+ 'panels.discover.tabReadme': 'Readme',
380
+ 'panels.discover.tabChangelog': 'Changelog',
381
+ 'panels.discover.docTitle': '{kind} for {version}',
382
+ 'panels.discover.docReadme': 'readme',
383
+ 'panels.discover.docChangelog': 'changelog',
384
+ 'panels.discover.docLoading': 'Reading…',
385
+ 'panels.discover.docMissing': 'This version ships no {kind}',
386
+ 'panels.discover.docUnavailable': 'Could not read the {kind} for this version: {reason}',
387
+ 'panels.discover.docUnknownReason': 'unknown',
388
+ 'panels.discover.detailTabs': 'Module details',
389
+ 'panels.discover.factPackage': 'Package',
390
+ 'panels.discover.factRegistry': 'Registry',
391
+ 'panels.discover.factRepository': 'Repository',
392
+ 'panels.discover.factCommit': 'Commit',
393
+ 'panels.discover.factDirectory': 'Directory',
394
+ 'panels.discover.factPublished': 'Published',
395
+ 'panels.discover.factAuthor': 'Author',
396
+ 'panels.discover.factHomepage': 'Homepage',
397
+ 'panels.discover.factCategory': 'Category',
398
+ 'panels.discover.factLabels': 'Labels',
399
+ 'panels.discover.factMarket': 'Index source',
400
+ 'panels.discover.detailVersions': 'Versions',
401
+ 'panels.discover.versionsLabel': 'Versions of {name}',
402
+ 'panels.discover.tagRecommended': 'Recommended',
403
+ 'panels.discover.tagPrerelease': 'Pre-release',
404
+ 'panels.discover.tagInstalled': 'Installed',
405
+ 'panels.discover.tagIncompatible': 'Incompatible',
406
+ 'panels.discover.tagUnknown': 'Unverified',
407
+ 'panels.discover.selected': 'Current',
408
+ 'panels.discover.done': 'Done',
409
+ 'panels.discover.installTrust': 'Modules run on this machine with your permissions. Make sure you trust where this comes from',
410
+ 'panels.discover.progress': 'Showing {shown} of {total}',
272
411
  'panels.market.add.approveBuilds': 'Allow these scripts and retry',
273
412
  'panels.market.add.approveHint': 'These packages want to run install scripts: {packages}',
274
413
  'panels.market.add.doneApplied': 'Installed and live.',
@@ -325,7 +464,7 @@ export const en: Record<keyof WorkbenchMessages, string> = {
325
464
  'blocker.login.titleGeneric': 'Sign-in required',
326
465
  'blocker.login.hint': 'The workbench uses your browser session; sign in once and you are done.',
327
466
  'blocker.login.go': 'Go sign in',
328
- 'blocker.login.manual': 'Run `opencli coding team-current` in a terminal, finish signing in, then retry.',
467
+ 'blocker.login.manual': 'Run the plugin login command in a terminal (see its docs), then retry.',
329
468
  'blocker.forbidden.title': 'No access to {platform}',
330
469
  'blocker.forbidden.titleGeneric': 'No access',
331
470
  'blocker.forbidden.hint': 'You are signed in, but this project/repo is not permitted for your account.',
@@ -339,26 +478,29 @@ export const en: Record<keyof WorkbenchMessages, string> = {
339
478
  'panels.empty': 'No modules on the panel yet',
340
479
  'panels.emptyHint': 'You can also just tell the agent: “add a module to the panel”.',
341
480
  'env.title': 'Preparing the workbench',
342
- 'env.checking': 'Checking the runtime environment…',
343
- 'env.installing': 'Installing the missing dependency…',
481
+ 'env.checking': 'Getting the runtime ready…',
482
+ 'env.installing': 'Installing background tools — the first run takes a moment…',
344
483
  'env.failed': 'One step away',
345
484
  'env.elapsed': 'Waiting {seconds}s',
346
485
  'env.stepFailed.install': 'install failed',
347
486
  'env.stepFailed.path': 'installed but not found',
348
487
  'env.stepFailed.shell': 'no shell channel',
488
+ 'env.toolchain.ok': 'Looks good',
489
+ 'env.toolchain.warn': 'Almost ready',
490
+ 'env.opencli.ok': 'Ready',
349
491
  'env.bridge.ok': 'Connected',
350
- 'env.bridge.short': 'Not connected',
351
- 'env.bridge.why': 'Panel data goes through the login state in your browser: with this channel down, modules cannot fetch data. It does not block startup: fix it, or enter the workbench first.',
352
- 'env.bridge.hold': 'The browser bridge is not connected yet \u2014 fix it below and hit Retry, or enter the workbench first.',
492
+ 'env.bridge.short': 'Not connected yet',
493
+ 'env.bridge.why': 'Panel data uses the login state in your browser. Without this connection, modules cannot fetch data. It does not block startup: fix it, or enter the workbench first.',
494
+ 'env.bridge.hold': 'The browser is not connected yet \u2014 fix it below and hit Retry, or enter the workbench first.',
353
495
  'env.bridge.daemon': 'The background service is not running. It usually starts by itself \u2014 run the command below in your terminal first.',
354
- 'env.bridge.extension': 'The browser extension is not connected. Install it once from the Chrome Web Store (then hit Retry here). If it is already installed, run the command below first.',
496
+ 'env.bridge.extension': 'The browser extension is not connected. Make sure the browser is running and the extension is enabled; install it once from the store if needed (then hit Retry here).',
355
497
  'env.bridge.extensionLink': 'Get the extension in the Chrome Web Store',
356
- 'env.bridge.profile': 'Several browser profiles are connected but none is the default: list them (command below), then pick one.',
357
- 'env.bridge.stale': 'The default browser profile is stale (it names an extension instance that no longer exists): pick one again.',
498
+ 'env.bridge.profile': 'Several browser accounts are connected but none is the default: list them (command below), then pick one.',
499
+ 'env.bridge.stale': 'The default browser account is stale (it names an extension instance that no longer exists): pick one again.',
358
500
  'env.bridge.unknown': 'Could not tell what went wrong. Expand the raw output and follow the steps in it.',
359
501
  'env.fix.title': 'How to fix it',
360
- 'env.fix.why': 'The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.',
361
- 'env.fix.whyPath': 'opencli is installed, but this environment cannot find it \u2014 usually a PATH or shell-session issue.',
502
+ 'env.fix.why': 'The workbench uses its own background tool (installed separately from the one in your terminal), and it is not set up on this machine yet.',
503
+ 'env.fix.whyPath': 'The background tool is installed, but this environment cannot find it \u2014 usually a PATH or shell-session issue.',
362
504
  'env.fix.whyShell': 'The workbench has no shell channel, so it cannot fetch data \u2014 you cannot install this from here; someone needs to fix the background environment.',
363
505
  'env.fix.step': 'Run this in a terminal, then hit Retry:',
364
506
  'env.fix.stepPath': 'Open a new terminal window (or make sure npm\u2019s global bin directory is on PATH), then hit Retry.',
@@ -367,32 +509,47 @@ export const en: Record<keyof WorkbenchMessages, string> = {
367
509
  'env.fix.network': 'Network unreachable: check your network or proxy, then retry.',
368
510
  'env.fix.details': 'Details (for troubleshooting)',
369
511
  'env.retry': 'Retry',
512
+ 'env.wake': 'Open browser',
513
+ 'env.wake.opening': 'Opening the browser…',
514
+ 'env.wake.browserOpen': 'The browser is already running but the extension is not connected — check that it is enabled.',
515
+ 'env.wake.noBrowser': 'No Chrome / Edge / Brave / Chromium / Vivaldi found; open one manually.',
516
+ 'env.wake.failed': 'Could not open the browser this time; try again.',
370
517
  'env.bridge.continue': 'Enter the workbench anyway',
371
518
  'env.diy.ok': 'Available',
372
- 'env.diy.short': 'Cannot load',
373
- 'env.diy.hold': 'DIY mode cannot load \u2014 upgrade dsh, then hit Retry; or enter the workbench first.',
374
- 'env.diy.why': 'The dsh on this machine is older than the one this workbench was verified against, so DIY mode cannot load. Panels and everything else are unaffected. Upgrade dsh and restart.',
519
+ 'env.diy.short': 'Unavailable for now',
520
+ 'env.diy.hold': 'DIY mode is unavailable for now \u2014 upgrade dsh, then hit Retry; or enter the workbench first.',
521
+ 'env.diy.why': 'The dsh on this machine is older than the one this workbench was verified against, so DIY mode cannot run. Panels and everything else are unaffected. Upgrade dsh and restart.',
375
522
  'env.diy.rows': 'This dsh is missing these items: {rows}',
376
523
  'env.diy.noRow': 'The health check did not find \u201cWorkbench DIY mode\u201d in dsh\u2019s mode roster \u2014 the workbench install most likely did not include the matching mode patch.',
377
524
  'env.diy.step': 'Upgrade dsh, then restart the workbench:',
378
525
  'env.diy.continue': 'Enter the workbench anyway',
379
526
  'env.copyCommand': 'Copy command',
380
527
  'env.copied': 'Copied',
381
- 'env.step.opencli': 'Checking the workbench opencli',
382
- 'env.step.codingPlugin': 'Checking the coding plugin',
383
- 'env.step.bridge': 'Checking the browser bridge',
384
- 'env.step.diy': 'Checking DIY mode',
385
- 'env.step.warm': 'Warming up site sessions',
386
- 'env.warm.done': '{n} site(s) warmed up',
387
- 'env.warm.short': 'Not warmed this time — harmless; the panel heals on first read',
528
+ 'env.step.toolchain': 'Runtime',
529
+ 'env.step.opencli': 'Background tools',
530
+ 'env.step.bridge': 'Browser connection',
531
+ 'env.step.diy': 'DIY mode',
532
+ 'env.step.warm': 'Site sign-in',
533
+ 'env.warm.done': 'Ready ({n} sites)',
534
+ 'env.warm.short': 'Could not sign in early this time \u2014 nothing breaks; the first read fills it in',
388
535
  'env.unit.failed': 'This module cannot start',
389
536
  'env.unit.failedHint': 'It failed while assembling itself; other modules are unaffected.',
390
- 'env.unit.missingPlugin': 'This module is not ready yet',
391
- 'env.unit.missingCommandsHint': 'Updating it should fix this.',
392
537
  'env.unit.unchecked': 'Cannot check: no shell channel',
393
538
  'env.unit.uncheckedHint': 'The module is not the problem \u2014 the shell channel is unavailable. Restart the workbench.',
394
- 'env.unit.missingCommands': 'This module is out of date',
539
+ 'adapterSet.not-configured': 'No adapter set configured; using the default.',
540
+ 'adapterSet.no-profile': 'No profile found, so the adapter set cannot load; using the default.',
541
+ 'adapterSet.malformed': 'An adapter set must be a package name (for example @acme/adapters-set); using the default.',
542
+ 'adapterSet.not-resolvable': '{spec} is not installed in this profile; install it or remove the config line.',
543
+ 'adapterSet.import-failed': '{spec} did not load; using the default set.',
544
+ 'adapterSet.bad-export': '{spec} does not export createAdapterSet(ctx); using the default set.',
545
+ 'adapterSet.factory-failed': '{spec} threw while creating the set; using the default set.',
546
+ 'adapterSet.incompatible-version': '{spec} uses an unsupported adapter protocol version; upgrade the adapter set or the workbench and retry.',
547
+ 'adapterSet.missing-member': '{spec} is missing a required member; using the default set.',
395
548
  'env.unit.hint': 'Retry after installing; other modules are unaffected.',
549
+ 'env.unit.unsupported': 'This module needs something this workbench does not know',
550
+ 'env.unit.unsupportedHint': 'It uses a need kind only newer workbenches have: upgrade the workbench, or ask the module author to use a v2 kind.',
551
+ 'env.unit.degraded': 'This module is missing one optional thing',
552
+ 'env.unit.degradedHint': 'It still works; use the command below to fill the gap.',
396
553
  'rightbar.label': 'Data panels',
397
554
  'rightbar.expand': 'Expand the data panel',
398
555
  'rightbar.collapse': 'Collapse the data panel',
@@ -404,7 +561,6 @@ export const en: Record<keyof WorkbenchMessages, string> = {
404
561
  'rightbar.updatedAt': 'updated {time}',
405
562
  'rightbar.noProject': 'The current session has no workspace',
406
563
  'rightbar.openPlatform': 'Open on the platform',
407
- 'coding.notARepo.title': 'This workspace is not a Coding repository',
408
564
  'error.unknown': 'Something went wrong',
409
565
 
410
566
  'board.title': 'Workbench panel',
@@ -412,6 +568,12 @@ export const en: Record<keyof WorkbenchMessages, string> = {
412
568
  'panel.conversation': 'Conversation',
413
569
  'panels.label': 'Global panels',
414
570
 
571
+ 'adapterSet.title': 'Adapter set',
572
+ 'adapterSet.lead': 'The host adapters this workbench is using. Change the workbench config in the profile and restart.',
573
+ 'adapterSet.active': 'Active: {id}@{version}',
574
+ 'adapterSet.defaults': 'Missing modules / runtime / plugins / actions are filled by the default set.',
575
+ 'adapterSet.failed': 'The configured set did not load; using the default.',
576
+ 'adapterSet.healthUnreadable': 'Could not read the workbench health; reopen this page later.',
415
577
  'workbenchSettings.nav': 'Workbench settings',
416
578
  'workbenchSettings.lead': 'Settings the workbench itself owns live here.',
417
579
 
@@ -426,39 +588,6 @@ export const en: Record<keyof WorkbenchMessages, string> = {
426
588
  'sidebarEdition.reload': 'Reload page',
427
589
  'sidebarEdition.failed': 'That choice did not save; try again.',
428
590
 
429
- 'configSync.nav': 'Config sync',
430
- 'configSync.lead': 'Bring over the rows another profile configures explicitly — pick any profile as the source.',
431
- 'configSync.source': 'Source',
432
- 'configSync.sourceBroken': 'its config is unreadable',
433
- 'configSync.sourceRows': '{name}: {count} rows are new or different for the workbench',
434
- 'configSync.sourceDead': 'unreadable',
435
- 'configSync.refresh': 'Read again',
436
- 'configSync.loading': 'Reading the source config…',
437
- 'configSync.readHint': 'Pick another source, or read again.',
438
- 'configSync.tag.new': 'New',
439
- 'configSync.tag.differs': 'Differs',
440
- 'configSync.conflictNote': 'Applying replaces this workbench copy with the source',
441
- 'configSync.code.lang': 'yaml',
442
- 'configSync.code.copy': 'Copy',
443
- 'configSync.code.copied': 'Copied',
444
- 'configSync.code.wrap': 'Wrap lines',
445
- 'configSync.code.unwrap': 'No wrap',
446
- 'configSync.code.collapse': 'Collapse',
447
- 'configSync.code.collapseAria': 'Collapse this row',
448
- 'configSync.code.expandAria': 'Expand the diff ({count} more lines)',
449
- 'configSync.code.expand': 'Show {count} more lines',
450
- 'configSync.missing': '{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market',
451
- 'configSync.apply': 'Sync {count} selected items',
452
- 'configSync.applyNone': 'Choose what to sync',
453
- 'configSync.applying': 'Writing…',
454
- 'configSync.applied': 'Written to the workbench config · applied',
455
- 'configSync.appliedIds': 'Written this time: {ids}',
456
- 'configSync.skippedIds': 'Left alone (already here): {ids}',
457
- 'configSync.nothing': 'Nothing to sync',
458
- 'configSync.unreadable': 'Cannot read {path}: {reason}',
459
- 'configSync.noSource': 'This machine has no other profile to sync from',
460
- 'configSync.emptyProviders': 'The workbench has no model provider yet — sync the model-provider rows from some profile, or configure one under Models.',
461
- 'configSync.failed': 'The sync did not go through; try again.',
462
591
 
463
592
  'debug.workspace': 'this workspace',
464
593
  'debug.status': 'Debugging “{title}”',
@@ -491,4 +620,29 @@ export const en: Record<keyof WorkbenchMessages, string> = {
491
620
  'approval.longTask.what': 'Stops',
492
621
  'approval.longTask.signal':
493
622
  'stopping only sends an interrupt signal — how the platform-side run finishes is up to the module',
623
+ 'approval.publish.module': 'Module',
624
+ 'approval.publish.target': 'Target',
625
+ 'approval.publish.version': 'Version',
626
+ 'approval.publish.registry': 'Registry',
627
+ 'approval.publish.repo': 'Repository',
628
+ 'approval.publish.branch': 'Branch',
629
+ 'approval.publish.defaultBranch': 'default branch',
630
+ 'approval.publish.artifacts': 'Artifacts',
631
+ 'approval.publish.index': 'Index',
632
+ 'approval.publish.commits': 'Commits',
633
+ 'approval.publish.twoCommits': 'artifacts + market.json in 2 commits, one push',
634
+ 'approval.publish.reading': 'Reading…',
635
+ 'approval.publish.changelog': 'Changelog for {version}',
636
+ 'approval.publish.changelogMissing': 'No changelog entry for {version}; publishing will be blocked',
637
+ 'approval.publish.targetAuto': 'configured default',
638
+ 'approval.publish.targetTeam': 'team registry',
639
+ 'approval.publish.targetPublic': 'public npm',
640
+ 'approval.publish.targetTarball': 'local tarball',
641
+ 'approval.publish.targetGit': 'git repository',
642
+ 'approval.publish.targetMarket': 'module market index',
643
+ 'approval.publish.targetLocal': 'keep local',
644
+ 'markdown.copy': 'Copy',
645
+ 'markdown.copied': 'Copied',
646
+ 'markdown.footnotes': 'Footnotes',
647
+ ...enNeedText,
494
648
  };
@@ -36,7 +36,7 @@ describe('mergeMessages', () => {
36
36
  mergeMessages(legacy, [
37
37
  { unit: 'issues', messages: { zh: { 'issues.title': '缺陷' }, en: { 'issues.title': 'Defects' } } },
38
38
  ]),
39
- ).toThrow(/文案键冲突:issues\.title 由 外壳 与 issues/);
39
+ ).toThrow(/文案键冲突:issues\.title 由 工作台 与 issues/);
40
40
  });
41
41
 
42
42
  it('★ 套件自己的两语言不同构 → 抛(外壳的类型管不到别的套件)', () => {
@@ -65,7 +65,7 @@ describe('mergeMessagesSkipping', () => {
65
65
  messages: { zh: { 'issues.mine': '我的缺陷' }, en: { 'issues.mine': 'My defects' } },
66
66
  };
67
67
  const bad = {
68
- unit: 'cmdb',
68
+ unit: 'inventory',
69
69
  messages: { zh: { 'wrong.prefix': '错了' }, en: { 'wrong.prefix': 'nope' } },
70
70
  };
71
71
  const later = {
@@ -83,15 +83,15 @@ describe('mergeMessagesSkipping', () => {
83
83
  });
84
84
  expect(dictionaries.en['builds.recent']).toBe('Recent builds');
85
85
  expect(problems).toHaveLength(1);
86
- expect(problems[0]?.unit).toBe('cmdb');
87
- expect(problems[0]?.reason).toMatch(/必须以 "cmdb\." 开头/);
86
+ expect(problems[0]?.unit).toBe('inventory');
87
+ expect(problems[0]?.reason).toMatch(/必须以 "inventory\." 开头/);
88
88
  });
89
89
 
90
90
  it('★ 坏的在前、好的在后:后面那份不受影响(不会因为前者坏就整批拒收)', () => {
91
91
  const { dictionaries, problems } = mergeMessagesSkipping(base, [bad, good]);
92
92
 
93
93
  expect(dictionaries.zh['issues.mine']).toBe('我的缺陷');
94
- expect(problems.map((item) => item.unit)).toEqual(['cmdb']);
94
+ expect(problems.map((item) => item.unit)).toEqual(['inventory']);
95
95
  });
96
96
 
97
97
  it('都好时与 mergeMessages 逐字一致、没有问题', () => {
@@ -109,7 +109,7 @@ describe('mergeMessagesSkipping', () => {
109
109
  const { dictionaries, problems } = mergeMessagesSkipping(base, [clash]);
110
110
 
111
111
  expect(dictionaries.zh['board.title']).toBe('看板');
112
- expect(problems[0]?.reason).toMatch(/文案键冲突:board\.title 由 外壳 与 board/);
112
+ expect(problems[0]?.reason).toMatch(/文案键冲突:board\.title 由 工作台 与 board/);
113
113
  });
114
114
 
115
115
  it('没带文案的那份直接跳过,不算问题', () => {
package/src/i18n/merge.ts CHANGED
@@ -31,7 +31,7 @@ export function mergeMessages(
31
31
  ): Dictionaries {
32
32
  const zh: Record<string, string> = { ...base.zh };
33
33
  const en: Record<string, string> = { ...base.en };
34
- const owner = new Map<string, string>(Object.keys(base.zh).map((key) => [key, '外壳']));
34
+ const owner = new Map<string, string>(Object.keys(base.zh).map((key) => [key, '工作台']));
35
35
 
36
36
  for (const item of contributions) {
37
37
  const messages = item.messages;
@@ -0,0 +1,27 @@
1
+ export const zhNeedText = {
2
+ 'env.need.bin.missing': '这台机器上缺命令',
3
+ 'env.need.bin.hint': '先把这条命令装进 PATH,再重试。',
4
+ 'env.need.extension.missing': '这个模块要的插件没装',
5
+ 'env.need.extension.outdated': '这个模块要的插件版本旧了',
6
+ 'env.need.extension.hint': '装好或升级之后点重试;不影响其它模块。',
7
+ 'env.need.lib.missing': '这个模块要的共用依赖没装',
8
+ 'env.need.lib.outdated': '这个模块要的共用依赖版本旧了',
9
+ 'env.need.lib.unsatisfied': '这个模块要的共用依赖版本不对',
10
+ 'env.need.lib.hint': '按下面的命令装好,再重试。',
11
+ 'env.need.env.missing': '这个模块要的环境变量没设',
12
+ 'env.need.env.hint': '设好这个变量后重启工作台;它的值不会被任何界面回显。',
13
+ } as const;
14
+
15
+ export const enNeedText = {
16
+ 'env.need.bin.missing': 'A command is missing on this machine',
17
+ 'env.need.bin.hint': 'Put that command on PATH, then retry.',
18
+ 'env.need.extension.missing': 'A plugin this module needs is not installed',
19
+ 'env.need.extension.outdated': 'A plugin this module needs is out of date',
20
+ 'env.need.extension.hint': 'Install or upgrade it, then retry; other modules are unaffected.',
21
+ 'env.need.lib.missing': 'A shared dependency this module needs is not installed',
22
+ 'env.need.lib.outdated': 'A shared dependency this module needs is out of date',
23
+ 'env.need.lib.unsatisfied': 'A shared dependency is at the wrong version',
24
+ 'env.need.lib.hint': 'Run the command below, then retry.',
25
+ 'env.need.env.missing': 'An environment variable this module needs is not set',
26
+ 'env.need.env.hint': 'Set it and restart the workbench; its value is never shown in any UI.',
27
+ } as const;