@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
@@ -0,0 +1,45 @@
1
+ import type { DshHostContext } from '../api/dsh.js';
2
+ import { adaptersOf } from './adapters.js';
3
+ import type { SupplyPort } from './port-types.js';
4
+ export type { SupplyPort } from './port-types.js';
5
+
6
+
7
+ export function supplyPortOf(ctx: DshHostContext): SupplyPort {
8
+ const set = adaptersOf(ctx);
9
+ const env = set.supply;
10
+ const modules = set.modules;
11
+ return {
12
+ env,
13
+ modules,
14
+ resolvePluginSource: (source, environment, options) => env.resolvePluginSource(source, environment, options),
15
+ libInstallCommand: (options) => env.libInstallCommand(options),
16
+ pluginInstallPlan: (options) => env.pluginInstallPlan(options),
17
+ latestVersion: (options) => env.latestVersion(options),
18
+ missingReleaseParts: (options) => env.missingReleaseParts(options),
19
+ probeRelease: (options) => env.probeRelease(options),
20
+ splitNpmSpec: (spec) => env.splitNpmSpec(spec),
21
+ isolatedHome: () => modules.isolatedHome(),
22
+ cliCatalogPath: () => modules.cliCatalogPath(),
23
+ vendorPluginsDir: () => modules.vendorPluginsDir(),
24
+ opencliInstallCommand: () => modules.opencliInstallCommand(),
25
+ profileDirOf: (context) => modules.profileDirOf(context),
26
+ profileModules: (dir) => modules.profileModules(dir),
27
+ readInstalledModule: (dir, pkg) => modules.readInstalledModule(dir, pkg),
28
+ readProfilePackage: (dir, pkg) => modules.readProfilePackage(dir, pkg),
29
+ readBundleManager: (context) => modules.readBundleManager(context),
30
+ createRegistryNotebook: (dir) => modules.createRegistryNotebook(dir),
31
+ declarationGaps: (dir) => modules.declarationGaps(dir),
32
+ moduleDeclarationOf: (dir, pkg) => modules.moduleDeclarationOf(dir, pkg),
33
+ registryDeclarationOf: (options) => modules.registryDeclarationOf(options),
34
+ pathDeclarationOf: (spec) => modules.pathDeclarationOf(spec),
35
+ declarationRefusalOf: (name, raw) => modules.declarationRefusalOf(name, raw),
36
+ refusalReason: () => modules.refusalReason(),
37
+ packageRouteOf: (options) => modules.packageRouteOf(options),
38
+ isNewerVersion: (left, right) => modules.isNewerVersion(left, right),
39
+ startSelfUpdate: (request, onError) => modules.startSelfUpdate(request, onError),
40
+ };
41
+ }
42
+
43
+ export function requireSupply(): SupplyPort {
44
+ throw new Error('workbenchSupply 未提供');
45
+ }
@@ -0,0 +1,22 @@
1
+ import dayjs from 'dayjs';
2
+ import utc from 'dayjs/plugin/utc.js';
3
+
4
+ dayjs.extend(utc);
5
+
6
+ /**
7
+ * UTC 时钟(`HH:mm:ss`):日志与状态行只给人看时分秒,不带日期。
8
+ * @param value ISO 字符串、时间戳或 Date。
9
+ * @returns `HH:mm:ss`;非法时间返回 `Invalid Date`。
10
+ */
11
+ export function clockOf(value: string | number | Date): string {
12
+ return dayjs(value).utc().format('HH:mm:ss');
13
+ }
14
+
15
+ /**
16
+ * 把时间戳/ISO 字符串转成毫秒;非法输入给 `NaN`(调用方据此回退)。
17
+ * @param value ISO 字符串、时间戳或 Date。
18
+ * @returns 毫秒时间戳或 `NaN`。
19
+ */
20
+ export function epochOf(value: string | number | Date): number {
21
+ return dayjs(value).valueOf();
22
+ }
@@ -0,0 +1,186 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+
4
+ export const DSH_THEME_PACKAGE = '@deepseek-ai/dsh-client-ui-theme';
5
+ export const SHELL_PACKAGE = '@dsh-workbench/core';
6
+ export const DSW_PREFIX = '--dsw-';
7
+ export const WB_PREFIX = '--wb-';
8
+
9
+ export interface TokenValues {
10
+ readonly light: string | null;
11
+ readonly dark: string | null;
12
+ }
13
+
14
+ export interface TokenEntry {
15
+ readonly name: string;
16
+ readonly values: TokenValues;
17
+ }
18
+
19
+ export interface TokenSource {
20
+ readonly package: string;
21
+ readonly version: string | null;
22
+ readonly file: string;
23
+ readonly entries: readonly TokenEntry[];
24
+ }
25
+
26
+ export interface TokenSet {
27
+ readonly dsw: TokenSource | null;
28
+ readonly wb: TokenSource | null;
29
+ }
30
+
31
+ const BLOCK = /([^{}]*)\{([^{}]*)\}/g;
32
+ const DECLARATION = /(--[a-z0-9-]+)\s*:\s*([^;{}]+)/g;
33
+ const DARK_BLOCK = /data-ds-dark-theme/;
34
+ const VAR_USE = /var\(\s*(--[a-z0-9-]+)\s*(?:,[^()]*)?\)/g;
35
+
36
+ function rawDefinitionsIn(text: string, prefix: string): Map<string, { light?: string; dark?: string }> {
37
+ const defs = new Map<string, { light?: string; dark?: string }>();
38
+ for (const block of text.matchAll(BLOCK)) {
39
+ const selector = block[1] ?? '';
40
+ const dark = DARK_BLOCK.test(selector);
41
+ for (const declaration of (block[2] ?? '').matchAll(DECLARATION)) {
42
+ const name = declaration[1] ?? '';
43
+ const value = (declaration[2] ?? '').trim();
44
+ if (!name.startsWith(prefix) || value === '') continue;
45
+ const found = defs.get(name) ?? {};
46
+ const key = dark ? 'dark' : 'light';
47
+ if (found[key] === undefined) found[key] = value;
48
+ defs.set(name, found);
49
+ }
50
+ }
51
+ return defs;
52
+ }
53
+
54
+ function resolved(value: string, scheme: 'light' | 'dark', defs: Map<string, { light?: string; dark?: string }>, depth = 0): string {
55
+ if (depth >= 4 || !value.includes('var(')) return value;
56
+ return value.replace(VAR_USE, (whole, name: string) => {
57
+ const found = defs.get(name);
58
+ if (found === undefined) return whole;
59
+ const next = scheme === 'dark' ? found.dark ?? found.light : found.light ?? found.dark;
60
+ return next === undefined ? whole : resolved(next, scheme, defs, depth + 1);
61
+ });
62
+ }
63
+
64
+ export function tokenEntriesIn(text: string, prefix: string): readonly TokenEntry[] {
65
+ const defs = rawDefinitionsIn(text, prefix);
66
+ return [...defs.entries()]
67
+ .map(([name, found]) => ({
68
+ name,
69
+ values: {
70
+ light: found.light === undefined ? null : resolved(found.light, 'light', defs),
71
+ dark: found.dark === undefined ? null : resolved(found.dark, 'dark', defs),
72
+ },
73
+ }))
74
+ .sort((left, right) => left.name.localeCompare(right.name));
75
+ }
76
+
77
+ interface PackageManifest {
78
+ readonly name: string | null;
79
+ readonly version: string | null;
80
+ readonly root: string;
81
+ }
82
+
83
+ function manifestAt(root: string): PackageManifest | null {
84
+ try {
85
+ const manifest: unknown = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
86
+ if (typeof manifest !== 'object' || manifest === null) return null;
87
+ const record = manifest as { name?: unknown; version?: unknown };
88
+ return {
89
+ name: typeof record.name === 'string' ? record.name : null,
90
+ version: typeof record.version === 'string' ? record.version : null,
91
+ root,
92
+ };
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+
98
+ function findPackage(startDirs: readonly string[], packageName: string): PackageManifest | null {
99
+ for (const start of startDirs) {
100
+ if (start.trim() === '') continue;
101
+ const own = manifestAt(start);
102
+ if (own !== null && own.name === packageName) return own;
103
+ let at = resolve(start);
104
+ for (;;) {
105
+ const candidate = join(at, 'node_modules', ...packageName.split('/'));
106
+ const manifest = manifestAt(candidate);
107
+ if (manifest !== null && (manifest.name === null || manifest.name === packageName)) return manifest;
108
+ const parent = dirname(at);
109
+ if (parent === at) break;
110
+ at = parent;
111
+ }
112
+ }
113
+ return null;
114
+ }
115
+
116
+ function sourceAt(
117
+ startDirs: readonly string[],
118
+ packageName: string,
119
+ tail: string,
120
+ prefix: string,
121
+ ): TokenSource | null {
122
+ const manifest = findPackage(startDirs, packageName);
123
+ if (manifest === null) return null;
124
+ const file = join(manifest.root, tail);
125
+ if (!existsSync(file)) return null;
126
+ return {
127
+ package: packageName,
128
+ version: manifest.version,
129
+ file,
130
+ entries: tokenEntriesIn(readFileSync(file, 'utf8'), prefix),
131
+ };
132
+ }
133
+
134
+ export function readTokens(startDirs: readonly string[]): TokenSet {
135
+ const dsw = sourceAt(startDirs, DSH_THEME_PACKAGE, join('lib', 'client.js'), DSW_PREFIX);
136
+ const wb = sourceAt(startDirs, SHELL_PACKAGE, 'client.js', WB_PREFIX);
137
+ return { dsw, wb };
138
+ }
139
+
140
+ function distance(left: string, right: string): number {
141
+ let previous = Array.from({ length: right.length + 1 }, (_unused, index) => index);
142
+ for (let row = 1; row <= left.length; row += 1) {
143
+ const current = [row];
144
+ for (let column = 1; column <= right.length; column += 1) {
145
+ const same = left[row - 1] === right[column - 1] ? 0 : 1;
146
+ current.push(
147
+ Math.min((previous[column] ?? 0) + 1, (current[column - 1] ?? 0) + 1, (previous[column - 1] ?? 0) + same),
148
+ );
149
+ }
150
+ previous = current;
151
+ }
152
+ return previous[right.length] ?? 0;
153
+ }
154
+
155
+ function commonPrefixLength(left: string, right: string): number {
156
+ const cap = Math.min(left.length, right.length);
157
+ let at = 0;
158
+ while (at < cap && left[at] === right[at]) at += 1;
159
+ return at;
160
+ }
161
+
162
+ export function nearestTokens(name: string, names: readonly string[], limit = 6): readonly string[] {
163
+ const wanted = name.trim().toLowerCase();
164
+ if (wanted === '') return [];
165
+ const shared = wanted.slice(0, wanted.lastIndexOf('-') + 1);
166
+ return names
167
+ .flatMap((one) => {
168
+ const lower = one.toLowerCase();
169
+ const typos = lower.length < 3 ? Number.POSITIVE_INFINITY : distance(lower, wanted);
170
+ if (typos <= 2) return [{ one, typos }];
171
+ const prefix = commonPrefixLength(lower, wanted);
172
+ if (prefix < 8) return [];
173
+ const sameStem = shared.length >= 8 && lower.startsWith(shared);
174
+ const score = 10 + typos - prefix + (sameStem ? 0 : 20);
175
+ return score < 20 ? [{ one, typos: score }] : [];
176
+ })
177
+ .sort((left, right) => left.typos - right.typos || left.one.length - right.one.length || left.one.localeCompare(right.one))
178
+ .slice(0, limit)
179
+ .map((one) => one.one);
180
+ }
181
+
182
+ export function tokenFamilyOf(name: string): string {
183
+ const rest = name.startsWith(DSW_PREFIX) ? name.slice(DSW_PREFIX.length) : name.startsWith(WB_PREFIX) ? name.slice(WB_PREFIX.length) : name;
184
+ const cut = rest.indexOf('-');
185
+ return cut === -1 ? rest : rest.slice(0, cut);
186
+ }
@@ -1,5 +1,4 @@
1
1
  import type { DshToolRunContext } from '../api/dsh.js';
2
- import { WorkbenchDataError } from './opencli.js';
3
2
 
4
3
  export function sessionWorkspace(exec: DshToolRunContext | undefined): string | null {
5
4
  const cwd = exec?.agent?.session?.header?.cwd;
@@ -25,37 +24,3 @@ export const TEXT_OUTPUT = { schema: { type: 'object', properties: {}, additiona
25
24
  export function jsonText(value: unknown): string {
26
25
  return JSON.stringify(value);
27
26
  }
28
-
29
- const UNCLASSIFIED = 'cli-unclassified';
30
-
31
- export interface CommandHintNames {
32
- readonly plugin: string;
33
- readonly suiteId: string;
34
- }
35
-
36
- export type CommandHint = <T>(command: string, run: () => Promise<T>) => Promise<T>;
37
-
38
- export function commandHintFor(names: CommandHintNames): CommandHint {
39
- return async (command, run) => {
40
- try {
41
- return await run();
42
- } catch (error) {
43
- if (!(error instanceof WorkbenchDataError) || error.code !== UNCLASSIFIED) throw error;
44
-
45
- const advice =
46
- `这条命令(${command})在这份 ${names.plugin} 插件里可能不存在(插件版本旧就会缺):` +
47
- `用 workbench_modules_update(id=${names.suiteId})升级插件,或在面板的模块状态里点更新,再重试。`;
48
-
49
- throw new WorkbenchDataError(error.code, `${error.message}。${advice}`, {
50
- ...(error.detail === undefined ? {} : { detail: error.detail }),
51
- hint:
52
- `升级:workbench_modules_update(id=${names.suiteId})。` +
53
- `终端确认:opencli ${names.plugin} ${command} --help${
54
- error.hint === undefined ? '' : `\n${error.hint}`
55
- }`,
56
- ...(error.helpUrl === undefined ? {} : { helpUrl: error.helpUrl }),
57
- ...(error.project === undefined ? {} : { project: error.project }),
58
- });
59
- }
60
- };
61
- }
@@ -1,12 +1,16 @@
1
1
  import type { DshHostContext } from '../api/dsh.js';
2
- import type { UnitManifest } from '../api/unit.js';
2
+ import type { UnitManifest } from '../contract/unit.js';
3
3
  import type { RouteTable } from '../host/http.js';
4
4
  import type { LongTaskBase, LongTaskHost, LongTaskRegistry } from '../host/long-task.js';
5
- import type { ProvisionHandler } from '../host/provision.js';
6
- import type { UnitCapability } from './unit-libs.js';
5
+ import type { ProvisionHandler } from './provision.js';
6
+ import type { UnitCapability } from '../contract/unit-capability.js';
7
7
  import type { ApprovalCall, ApprovalFacts, ApprovalPolicy } from '../host/tool-approval.js';
8
8
  import type { ValueHandoff } from '../host/value-handoff.js';
9
9
  import type { WorkspaceStore } from '../host/workspace-store.js';
10
+ import type { DataReader } from '../contract/data.js';
11
+ import type { LibReader } from '../contract/lib.js';
12
+ import type { GitReader } from '../contract/git.js';
13
+ import type { CommandReader } from '../contract/command.js';
10
14
 
11
15
  export interface ToolScopeContext {
12
16
  readonly workspace: string | null;
@@ -20,7 +24,11 @@ export interface UnitMountDeps {
20
24
  readonly manifests: () => readonly UnitManifest[];
21
25
  readonly ownedUnits: () => readonly string[];
22
26
  readonly installable?: (() => readonly string[]) | undefined;
23
- readonly opencliCommand?: string;
27
+ readonly data: DataReader;
28
+ readonly env?: Readonly<Record<string, string | undefined>> | undefined;
29
+ readonly libs?: LibReader | undefined;
30
+ readonly git?: GitReader | undefined;
31
+ readonly commands?: CommandReader | undefined;
24
32
  readonly store: WorkspaceStore;
25
33
  readonly values?: ValueHandoff | undefined;
26
34
  readonly probe?: (
@@ -0,0 +1,13 @@
1
+ import semver from 'semver';
2
+
3
+ export type VersionVerdict = 'satisfied' | 'unsatisfied' | 'malformed';
4
+
5
+ export function checkVersionRange(contract: string | undefined, version: string): VersionVerdict {
6
+ const spec = contract?.trim() ?? '';
7
+ if (spec === '') return 'satisfied';
8
+ const range = semver.validRange(spec);
9
+ if (range === null) return 'malformed';
10
+ const parsed = semver.coerce(version);
11
+ if (parsed === null) return 'malformed';
12
+ return semver.satisfies(parsed, range) ? 'satisfied' : 'unsatisfied';
13
+ }
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import semver from 'semver';
3
+
4
+ export function compareVersions(left: string, right: string): number | undefined {
5
+ const a = semver.valid(left.trim());
6
+ const b = semver.valid(right.trim());
7
+ if (a === null || b === null) return undefined;
8
+ return semver.compare(a, b);
9
+ }
10
+
11
+ export function isValidVersion(value: string): boolean {
12
+ return semver.valid(value.trim()) !== null;
13
+ }
14
+
15
+ export function isNewerVersion(latest: string, installed: string): boolean {
16
+ if (latest === installed) return false;
17
+ const compared = compareVersions(latest, installed);
18
+ return compared === undefined ? true : compared > 0;
19
+ }
20
+
21
+ export function runningVersionOf(moduleUrl: string): string | undefined {
22
+ try {
23
+ const read = JSON.parse(readFileSync(new URL('../../package.json', moduleUrl), 'utf8')) as {
24
+ readonly version?: unknown;
25
+ };
26
+ return typeof read.version === 'string' && read.version !== '' ? read.version : undefined;
27
+ } catch {
28
+ return undefined;
29
+ }
30
+ }
package/src/host.ts CHANGED
@@ -1,38 +1,75 @@
1
1
  export * from './config/constants.js';
2
2
  export * from './api/context-ref.js';
3
- export * from './api/unit.js';
4
- export * from './api/facts.js';
5
- export * from './api/long-task.js';
3
+ export * from './contract/unit.js';
4
+ export * from './contract/needs.js';
5
+ export * from './contract/data.js';
6
+ export * from './contract/extension.js';
7
+ export * from './contract/lib.js';
8
+ export * from './contract/git.js';
9
+ export * from './contract/command.js';
10
+ export * from './contract/unit-board.js';
11
+ export * from './contract/workbench-contract.js';
12
+ export * from './contract/blocker.js';
13
+ export * from './contract/facts.js';
14
+ export * from './contract/long-task.js';
6
15
  export * from './lib/text.js';
7
16
  export * from './lib/ui.js';
8
17
  export * from './lib/board-fact.js';
9
18
  export * from './api/blocker-table.js';
19
+ export * from './contract/unit-declaration.js';
10
20
  export * from './host/board-fact.js';
11
- export * from './host/browser-find.js';
12
- export * from './host/browser-read.js';
13
- export * from './host/cli-error.js';
14
21
  export * from './host/context-ref.js';
15
- export * from './host/data-root.js';
16
22
  export * from './host/diy-debug.js';
17
23
  export * from './host/diy-record.js';
18
24
  export * from './host/facts.js';
19
25
  export * from './host/git.js';
20
26
  export * from './host/http.js';
27
+ export * from './host/lib-capabilities.js';
21
28
  export * from './host/long-task.js';
22
- export * from './host/opencli-runtime.js';
23
- export * from './host/opencli-window.js';
24
- export * from './host/opencli.js';
25
29
  export * from './host/panel-state.js';
26
30
  export * from './host/plugin-ledger.js';
27
- export * from './host/plugin-source.js';
28
- export * from './host/provision.js';
29
- export * from './host/shell-text.js';
30
- export * from './host/shell.js';
31
+ export * from './host/time.js';
32
+ export * from './host/tokens.js';
31
33
  export * from './host/tool-approval.js';
32
34
  export * from './host/tool-kit.js';
33
- export * from './host/unit-declaration.js';
34
35
  export * from './host/unit-face.js';
35
- export * from './host/unit-libs.js';
36
36
  export * from './host/value-handoff.js';
37
37
  export * from './host/workspace-store.js';
38
38
  export * from './host/write-result.js';
39
+ export * from './host/cli-error.js';
40
+ export * from './host/data-root.js';
41
+ export * from './host/shell-text.js';
42
+ export * from './host/shell.js';
43
+ export * from './host/data-error.js';
44
+ export * from './host/provision.js';
45
+ export * from './host/channel-plugin.js';
46
+ export * from './host/recipe.js';
47
+ export * from './host/recipe-rules.js';
48
+ export * from './host/release-packages.generated.js';
49
+ export * from './contract/unit-capability.js';
50
+ export * from './contract/plugin-source.js';
51
+ export * from './contract/cli.js';
52
+ export * from './host/cli.js';
53
+ export * from './host/command-name.js';
54
+ export * from './host/browser.js';
55
+ export * from './host/preflight.js';
56
+ export * from './host/platform.js';
57
+ export * from './host/profile-port.js';
58
+ export * from './host/supply-port.js';
59
+ export * from './host/version.js';
60
+ export * from './host/adapter-types.js';
61
+ export * from './host/paths.js';
62
+ export * from './host/plugin.js';
63
+ export * from './host/spec.js';
64
+ export * from './host/plugin-source.js';
65
+ export * from './host/lib-install.js';
66
+ export * from './host/supply-index.js';
67
+ export * from './host/patch.js';
68
+ export * from './host/adapters.js';
69
+ export * from './host/adapter-set.js';
70
+ export * from './host/needs.js';
71
+ export * from './host/extension.js';
72
+ export * from './host/port-types.js';
73
+ export * from './host/version-range.js';
74
+ export * from './host/market-index.js';
75
+ export * from './host/changelog.js';