@dsh-workbench/shared 0.3.10 → 1.0.0-beta.0

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 (391) 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 +19 -1
  6. package/dist/api/host-write.d.ts +0 -15
  7. package/dist/api/host-write.js +1 -35
  8. package/dist/api/workbench-client.js +2 -1
  9. package/dist/components/Activity.css +0 -1
  10. package/dist/components/ApprovalDetail.css +1 -2
  11. package/dist/components/ApprovalDetail.d.ts +1 -1
  12. package/dist/components/ApprovalPlan.css +0 -1
  13. package/dist/components/Card.css +0 -1
  14. package/dist/components/Card.d.ts +1 -1
  15. package/dist/components/CardBoundary.d.ts +1 -1
  16. package/dist/components/CardHead.css +0 -1
  17. package/dist/components/CardHead.d.ts +1 -1
  18. package/dist/components/ChoiceGroup.css +1 -2
  19. package/dist/components/ConfirmBar.d.ts +1 -1
  20. package/dist/components/ConfirmBar.js +1 -1
  21. package/dist/components/Form.css +1 -1
  22. package/dist/components/FormActions.js +1 -1
  23. package/dist/components/LongTaskRow.css +1 -2
  24. package/dist/components/LongTaskRow.d.ts +1 -1
  25. package/dist/components/LongTaskRow.js +1 -1
  26. package/dist/components/Note.css +0 -1
  27. package/dist/components/ResourceStates.css +0 -1
  28. package/dist/components/SettingsSection.css +0 -1
  29. package/dist/components/Spinner.css +0 -1
  30. package/dist/components/Stack.css +0 -1
  31. package/dist/components/StateBlock.css +0 -1
  32. package/dist/components/board-module.d.ts +3 -3
  33. package/dist/components/icons.d.ts +1 -7
  34. package/dist/components/icons.js +11 -16
  35. package/dist/config/constants.d.ts +2 -2
  36. package/dist/config/constants.js +2 -2
  37. package/dist/config/storage.d.ts +0 -4
  38. package/dist/config/storage.js +0 -11
  39. package/dist/contract/adapters.d.ts +10 -0
  40. package/dist/contract/cli.d.ts +3 -0
  41. package/dist/contract/data.d.ts +126 -0
  42. package/dist/{api → contract}/facts.d.ts +12 -3
  43. package/dist/{api → contract}/facts.js +19 -1
  44. package/dist/contract/needs.d.ts +132 -0
  45. package/dist/contract/needs.js +232 -0
  46. package/dist/contract/plugin-source.d.ts +1 -0
  47. package/dist/contract/plugin-source.js +1 -0
  48. package/dist/contract/protocol/bundle-install.d.ts +136 -0
  49. package/dist/contract/protocol/bundle-install.js +12 -0
  50. package/dist/contract/protocol/config-sync.d.ts +55 -0
  51. package/dist/contract/protocol/config-sync.js +2 -0
  52. package/dist/contract/protocol/diy.d.ts +4 -0
  53. package/dist/contract/protocol/diy.js +4 -0
  54. package/dist/contract/protocol/dsh-plugins.d.ts +11 -0
  55. package/dist/contract/protocol/dsh-plugins.js +1 -0
  56. package/dist/contract/protocol/long-tasks.d.ts +13 -0
  57. package/dist/contract/protocol/long-tasks.js +1 -0
  58. package/dist/contract/protocol/market-index.d.ts +195 -0
  59. package/dist/contract/protocol/market-index.js +7 -0
  60. package/dist/contract/protocol/platform.d.ts +44 -0
  61. package/dist/contract/protocol/platform.js +1 -0
  62. package/dist/contract/protocol/preflight-wake.d.ts +7 -0
  63. package/dist/contract/protocol/preflight-wake.js +1 -0
  64. package/dist/contract/protocol/profile-create.d.ts +30 -0
  65. package/dist/contract/protocol/profile-create.js +2 -0
  66. package/dist/contract/protocol/sidebar-edition.d.ts +14 -0
  67. package/dist/contract/protocol/sidebar-edition.js +2 -0
  68. package/dist/contract/protocol/unit-manifests.d.ts +6 -0
  69. package/dist/contract/protocol/unit-manifests.js +1 -0
  70. package/dist/contract/unit-board.d.ts +18 -0
  71. package/dist/contract/unit-board.js +1 -0
  72. package/dist/contract/unit-capability.d.ts +34 -0
  73. package/dist/contract/unit-capability.js +1 -0
  74. package/dist/{api → contract}/unit-declaration.d.ts +7 -5
  75. package/dist/{api → contract}/unit-declaration.js +19 -13
  76. package/dist/contract/unit.d.ts +57 -0
  77. package/dist/contract/unit.js +24 -0
  78. package/dist/contract/workbench-contract.d.ts +15 -0
  79. package/dist/contract/workbench-contract.js +1 -0
  80. package/dist/host/adapter-set.d.ts +26 -0
  81. package/dist/host/adapter-set.js +243 -0
  82. package/dist/host/adapter-types.d.ts +79 -0
  83. package/dist/host/adapter-types.js +23 -0
  84. package/dist/host/adapters.d.ts +22 -0
  85. package/dist/host/adapters.js +9 -0
  86. package/dist/host/browser.d.ts +3 -0
  87. package/dist/host/browser.js +3 -0
  88. package/dist/host/changelog.d.ts +21 -0
  89. package/dist/host/changelog.js +188 -0
  90. package/dist/host/channel-plugin.d.ts +15 -0
  91. package/dist/host/channel-plugin.js +42 -0
  92. package/dist/host/cli.d.ts +4 -0
  93. package/dist/host/cli.js +7 -0
  94. package/dist/host/command-name.d.ts +1 -0
  95. package/dist/host/command-name.js +14 -0
  96. package/dist/host/data-error.d.ts +13 -0
  97. package/dist/host/data-error.js +20 -0
  98. package/dist/host/data-root.js +3 -0
  99. package/dist/host/diy-debug.js +2 -1
  100. package/dist/host/diy-record.js +2 -1
  101. package/dist/host/facts.d.ts +1 -1
  102. package/dist/host/facts.js +3 -2
  103. package/dist/host/git.js +2 -2
  104. package/dist/host/http.js +1 -1
  105. package/dist/host/lib-capabilities.d.ts +22 -0
  106. package/dist/host/lib-capabilities.js +37 -0
  107. package/dist/host/lib-install.d.ts +9 -0
  108. package/dist/host/lib-install.js +10 -0
  109. package/dist/host/long-task.d.ts +1 -1
  110. package/dist/host/long-task.js +4 -3
  111. package/dist/host/market-index.d.ts +22 -0
  112. package/dist/host/market-index.js +420 -0
  113. package/dist/host/needs.d.ts +4 -0
  114. package/dist/host/needs.js +2 -0
  115. package/dist/host/patch.d.ts +9 -0
  116. package/dist/host/patch.js +78 -0
  117. package/dist/host/paths.d.ts +12 -0
  118. package/dist/host/paths.js +28 -0
  119. package/dist/host/platform.d.ts +14 -0
  120. package/dist/host/platform.js +40 -0
  121. package/dist/host/plugin-source.d.ts +8 -6
  122. package/dist/host/plugin-source.js +43 -33
  123. package/dist/host/plugin.d.ts +4 -0
  124. package/dist/host/plugin.js +39 -0
  125. package/dist/host/port-types.d.ts +191 -0
  126. package/dist/host/port-types.js +1 -0
  127. package/dist/host/preflight.d.ts +28 -0
  128. package/dist/host/preflight.js +1 -0
  129. package/dist/host/profile-port.d.ts +4 -0
  130. package/dist/host/profile-port.js +4 -0
  131. package/dist/host/provision.d.ts +2 -2
  132. package/dist/host/provision.js +5 -3
  133. package/dist/host/recipe-rules.d.ts +5 -0
  134. package/dist/host/recipe-rules.js +382 -0
  135. package/dist/host/recipe.d.ts +14 -0
  136. package/dist/host/recipe.js +283 -0
  137. package/dist/host/shell-text.d.ts +9 -2
  138. package/dist/host/shell-text.js +15 -3
  139. package/dist/host/shell.d.ts +2 -0
  140. package/dist/host/shell.js +7 -0
  141. package/dist/host/spec.d.ts +8 -0
  142. package/dist/host/spec.js +24 -0
  143. package/dist/host/supply-index.d.ts +34 -0
  144. package/dist/host/supply-index.js +202 -0
  145. package/dist/host/supply-port.d.ts +5 -0
  146. package/dist/host/supply-port.js +39 -0
  147. package/dist/host/time.d.ts +12 -0
  148. package/dist/host/time.js +19 -0
  149. package/dist/host/tokens.d.ts +26 -0
  150. package/dist/host/tokens.js +154 -0
  151. package/dist/host/tool-approval.d.ts +12 -0
  152. package/dist/host/tool-approval.js +4 -0
  153. package/dist/host/tool-kit.js +1 -1
  154. package/dist/host/unit-face.d.ts +5 -4
  155. package/dist/host/version-range.d.ts +2 -0
  156. package/dist/host/version-range.js +73 -0
  157. package/dist/host/version.d.ts +3 -0
  158. package/dist/host/version.js +29 -0
  159. package/dist/host.d.ts +47 -16
  160. package/dist/host.js +47 -16
  161. package/dist/i18n/en.js +259 -86
  162. package/dist/i18n/index.d.ts +333 -88
  163. package/dist/i18n/merge.js +1 -1
  164. package/dist/i18n/need-text.d.ts +26 -0
  165. package/dist/i18n/need-text.js +26 -0
  166. package/dist/i18n/settings.d.ts +70 -0
  167. package/dist/i18n/settings.js +136 -0
  168. package/dist/i18n/zh.d.ts +332 -87
  169. package/dist/i18n/zh.js +260 -87
  170. package/dist/index.d.ts +24 -8
  171. package/dist/index.js +24 -8
  172. package/dist/lib/blocker-action.d.ts +0 -15
  173. package/dist/lib/blocker-action.js +1 -25
  174. package/dist/{api → lib}/dsh-client.d.ts +12 -1
  175. package/dist/lib/dsh-client.js +1 -0
  176. package/dist/lib/market-index.d.ts +7 -0
  177. package/dist/lib/market-index.js +25 -0
  178. package/dist/lib/react-types.d.ts +5 -0
  179. package/dist/lib/react-types.js +1 -0
  180. package/dist/lib/react.d.ts +1 -40
  181. package/dist/lib/react.js +0 -36
  182. package/dist/lib/ui.js +3 -9
  183. package/dist/testing/data.d.ts +13 -0
  184. package/dist/testing/data.js +46 -0
  185. package/dist/testing/declaration.d.ts +1 -1
  186. package/dist/testing/declaration.js +1 -1
  187. package/dist/testing/host-fakes.d.ts +0 -13
  188. package/dist/testing/host-fakes.js +0 -24
  189. package/dist/testing/needs.d.ts +16 -0
  190. package/dist/testing/needs.js +46 -0
  191. package/dist/testing.d.ts +2 -0
  192. package/dist/testing.js +2 -0
  193. package/package.json +18 -2
  194. package/src/api/__tests__/blocker-table.test.ts +135 -86
  195. package/src/api/blocker-table.ts +52 -26
  196. package/src/api/dsh.ts +17 -1
  197. package/src/api/host-write.ts +0 -43
  198. package/src/api/workbench-client.test.ts +2 -2
  199. package/src/api/workbench-client.ts +2 -1
  200. package/src/components/Activity.css +0 -1
  201. package/src/components/ApprovalDetail.css +1 -2
  202. package/src/components/ApprovalDetail.tsx +1 -1
  203. package/src/components/ApprovalPlan.css +0 -1
  204. package/src/components/Card.css +0 -1
  205. package/src/components/Card.tsx +1 -1
  206. package/src/components/CardAnchor.test.tsx +1 -1
  207. package/src/components/CardBoundary.tsx +1 -1
  208. package/src/components/CardHead.css +0 -1
  209. package/src/components/CardHead.tsx +1 -1
  210. package/src/components/ChoiceGroup.css +1 -2
  211. package/src/components/ConfirmBar.tsx +1 -1
  212. package/src/components/Form.css +1 -1
  213. package/src/components/Form.tsx +1 -1
  214. package/src/components/FormActions.tsx +1 -1
  215. package/src/components/LongTaskRow.css +1 -2
  216. package/src/components/LongTaskRow.tsx +1 -1
  217. package/src/components/Note.css +0 -1
  218. package/src/components/ResourceStates.css +0 -1
  219. package/src/components/SelectFieldNodes.tsx +0 -1
  220. package/src/components/SettingsSection.css +0 -1
  221. package/src/components/Spinner.css +0 -1
  222. package/src/components/Stack.css +0 -1
  223. package/src/components/StateBlock.css +0 -1
  224. package/src/components/__tests__/long-task-row.test.ts +1 -1
  225. package/src/components/board-module.ts +3 -3
  226. package/src/components/icons.tsx +16 -24
  227. package/src/config/constants.ts +2 -2
  228. package/src/config/storage.test.ts +1 -25
  229. package/src/config/storage.ts +0 -12
  230. package/src/{api → contract}/__tests__/facts.test.ts +73 -25
  231. package/src/{api → contract}/__tests__/long-task.test.ts +3 -3
  232. package/src/contract/__tests__/needs.test.ts +74 -0
  233. package/src/{host → contract}/__tests__/unit-declaration.test.ts +1 -1
  234. package/src/contract/__tests__/unit.test.ts +43 -0
  235. package/src/contract/adapters.ts +9 -0
  236. package/src/contract/cli.ts +3 -0
  237. package/src/contract/data.ts +145 -0
  238. package/src/{api → contract}/facts.ts +34 -4
  239. package/src/contract/needs.ts +331 -0
  240. package/src/contract/plugin-source.ts +1 -0
  241. package/src/contract/protocol/bundle-install.ts +198 -0
  242. package/src/contract/protocol/config-sync.ts +65 -0
  243. package/src/contract/protocol/diy.ts +4 -0
  244. package/src/contract/protocol/dsh-plugins.ts +13 -0
  245. package/src/contract/protocol/long-tasks.ts +16 -0
  246. package/src/contract/protocol/market-index.ts +246 -0
  247. package/src/contract/protocol/platform.ts +47 -0
  248. package/src/contract/protocol/preflight-wake.ts +17 -0
  249. package/src/contract/protocol/profile-create.ts +36 -0
  250. package/src/contract/protocol/sidebar-edition.ts +19 -0
  251. package/src/contract/protocol/unit-manifests.ts +8 -0
  252. package/src/contract/unit-board.ts +23 -0
  253. package/src/contract/unit-capability.ts +37 -0
  254. package/src/{host → contract}/unit-declaration.ts +22 -18
  255. package/src/contract/unit.ts +76 -0
  256. package/src/contract/workbench-contract.ts +30 -0
  257. package/src/host/__tests__/adapter-set.test.ts +228 -0
  258. package/src/host/__tests__/adapters.test.ts +27 -0
  259. package/src/host/__tests__/changelog.test.ts +102 -0
  260. package/src/host/__tests__/command-name.test.ts +16 -0
  261. package/src/host/__tests__/diy-record.test.ts +3 -3
  262. package/src/host/__tests__/facts.test.ts +5 -5
  263. package/src/host/__tests__/long-task.test.ts +1 -1
  264. package/src/host/__tests__/market-index.test.ts +179 -0
  265. package/src/host/__tests__/plugin-ledger.test.ts +10 -10
  266. package/src/host/__tests__/provision.test.ts +7 -6
  267. package/src/host/__tests__/shell-text.test.ts +16 -1
  268. package/src/host/__tests__/supply-index.test.ts +137 -0
  269. package/src/host/__tests__/tokens.test.ts +110 -0
  270. package/src/host/__tests__/version-range.test.ts +21 -0
  271. package/src/host/adapter-set.ts +298 -0
  272. package/src/host/adapter-types.ts +105 -0
  273. package/src/host/adapters.ts +44 -0
  274. package/src/host/browser.ts +3 -0
  275. package/src/host/changelog.ts +212 -0
  276. package/src/host/channel-plugin.ts +55 -0
  277. package/src/host/cli.ts +11 -0
  278. package/src/host/command-name.ts +15 -0
  279. package/src/host/data-error.ts +21 -0
  280. package/src/host/data-root.ts +2 -0
  281. package/src/host/diy-debug.ts +2 -1
  282. package/src/host/diy-record.ts +2 -1
  283. package/src/host/facts.ts +4 -3
  284. package/src/host/git.ts +2 -2
  285. package/src/host/http.ts +1 -1
  286. package/src/host/lib-capabilities.ts +52 -0
  287. package/src/host/lib-install.ts +18 -0
  288. package/src/host/long-task.ts +4 -3
  289. package/src/host/market-index.ts +413 -0
  290. package/src/host/needs.ts +6 -0
  291. package/src/host/patch.ts +93 -0
  292. package/src/host/paths.ts +37 -0
  293. package/src/host/platform.ts +48 -0
  294. package/src/host/plugin-source.ts +48 -56
  295. package/src/host/plugin.ts +39 -0
  296. package/src/host/port-types.ts +222 -0
  297. package/src/host/preflight.ts +31 -0
  298. package/src/host/profile-port.ts +9 -0
  299. package/src/host/provision.ts +7 -4
  300. package/src/host/recipe-rules.ts +330 -0
  301. package/src/host/recipe.test.ts +334 -0
  302. package/src/host/recipe.ts +323 -0
  303. package/src/host/shell-text.ts +15 -3
  304. package/src/host/shell.ts +9 -0
  305. package/src/host/spec.ts +32 -0
  306. package/src/host/supply-index.ts +256 -0
  307. package/src/host/supply-port.ts +45 -0
  308. package/src/host/time.ts +22 -0
  309. package/src/host/tokens.ts +186 -0
  310. package/src/host/tool-approval.ts +17 -0
  311. package/src/host/tool-kit.ts +1 -1
  312. package/src/host/unit-face.ts +5 -4
  313. package/src/host/version-range.ts +71 -0
  314. package/src/host/version.ts +30 -0
  315. package/src/host.ts +47 -16
  316. package/src/i18n/en.ts +261 -86
  317. package/src/i18n/merge.test.ts +6 -6
  318. package/src/i18n/merge.ts +1 -1
  319. package/src/i18n/need-text.ts +27 -0
  320. package/src/i18n/settings.ts +141 -0
  321. package/src/i18n/zh.ts +263 -87
  322. package/src/index.ts +24 -8
  323. package/src/lib/blocker-action.ts +0 -28
  324. package/src/{api → lib}/dsh-client.ts +16 -2
  325. package/src/lib/market-index.ts +36 -0
  326. package/src/lib/react-types.ts +5 -0
  327. package/src/lib/react.ts +1 -40
  328. package/src/lib/text.test.ts +2 -2
  329. package/src/lib/ui.test.ts +6 -5
  330. package/src/lib/ui.ts +3 -9
  331. package/src/testing/__tests__/declaration.test.ts +1 -1
  332. package/src/testing/data.ts +66 -0
  333. package/src/testing/declaration.ts +2 -2
  334. package/src/testing/host-fakes.ts +0 -38
  335. package/src/testing/needs.ts +80 -0
  336. package/src/testing.ts +2 -0
  337. package/dist/api/unit-board.d.ts +0 -39
  338. package/dist/api/unit-board.js +0 -45
  339. package/dist/api/unit.d.ts +0 -85
  340. package/dist/api/unit.js +0 -8
  341. package/dist/api/workbench-contract.d.ts +0 -44
  342. package/dist/components/MockStrip.css +0 -39
  343. package/dist/components/MockStrip.d.ts +0 -15
  344. package/dist/components/MockStrip.js +0 -8
  345. package/dist/components/SaveBar.css +0 -7
  346. package/dist/host/browser-find.d.ts +0 -38
  347. package/dist/host/browser-find.js +0 -242
  348. package/dist/host/browser-read.d.ts +0 -28
  349. package/dist/host/browser-read.js +0 -243
  350. package/dist/host/opencli-runtime.d.ts +0 -25
  351. package/dist/host/opencli-runtime.js +0 -56
  352. package/dist/host/opencli-window.d.ts +0 -2
  353. package/dist/host/opencli-window.js +0 -8
  354. package/dist/host/opencli.d.ts +0 -37
  355. package/dist/host/opencli.js +0 -155
  356. package/dist/host/unit-declaration.d.ts +0 -65
  357. package/dist/host/unit-declaration.js +0 -213
  358. package/dist/host/unit-libs.d.ts +0 -37
  359. package/dist/lib/diy-debug.d.ts +0 -80
  360. package/dist/lib/diy-debug.js +0 -88
  361. package/dist/lib/diy-record.d.ts +0 -135
  362. package/dist/lib/diy-record.js +0 -162
  363. package/dist/lib/lint-probe.d.ts +0 -1
  364. package/dist/lib/lint-probe.js +0 -6
  365. package/dist/lib/panel-state.d.ts +0 -120
  366. package/dist/lib/panel-state.js +0 -176
  367. package/src/api/__tests__/host-write.test.ts +0 -75
  368. package/src/api/__tests__/unit-board.test.ts +0 -76
  369. package/src/api/__tests__/unit.test.ts +0 -38
  370. package/src/api/unit-board.ts +0 -69
  371. package/src/api/unit.ts +0 -93
  372. package/src/api/workbench-contract.ts +0 -59
  373. package/src/host/__tests__/browser-find.test.ts +0 -330
  374. package/src/host/__tests__/browser-read.test.ts +0 -228
  375. package/src/host/__tests__/opencli-runtime.test.ts +0 -46
  376. package/src/host/browser-find.ts +0 -311
  377. package/src/host/browser-read.ts +0 -311
  378. package/src/host/opencli-runtime.ts +0 -79
  379. package/src/host/opencli-window.ts +0 -11
  380. package/src/host/opencli.ts +0 -213
  381. package/src/host/unit-libs.ts +0 -41
  382. package/src/lib/blocker-action.test.ts +0 -40
  383. /package/dist/{api/blocker.js → contract/adapters.js} +0 -0
  384. /package/dist/{api → contract}/blocker.d.ts +0 -0
  385. /package/dist/{api/dsh-client.js → contract/blocker.js} +0 -0
  386. /package/dist/{api/workbench-contract.js → contract/cli.js} +0 -0
  387. /package/dist/{host/unit-libs.js → contract/data.js} +0 -0
  388. /package/dist/{api → contract}/long-task.d.ts +0 -0
  389. /package/dist/{api → contract}/long-task.js +0 -0
  390. /package/src/{api → contract}/blocker.ts +0 -0
  391. /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
+ }
@@ -75,9 +75,17 @@ export interface ApprovalCall {
75
75
  readonly session?: string | undefined;
76
76
  }
77
77
 
78
+ /**
79
+ * 套件对一次写调用给出的判定:`read` 只是看看、`allow` 会写但本套件不问、`deny` 这一次根本跑不成
80
+ * (连问都不该问,`reason` 原样交给 agent)、`ask` 要用户点头(`question` 接在明细后,`fallback` 是没明细时的整句)。
81
+ */
78
82
  export type ApprovalVerdict =
79
83
  | { readonly kind: 'read' }
80
84
  | { readonly kind: 'allow' }
85
+ | {
86
+ readonly kind: 'deny';
87
+ readonly reason: string;
88
+ }
81
89
  | {
82
90
  readonly kind: 'ask';
83
91
  readonly reason: string;
@@ -87,10 +95,15 @@ export type ApprovalVerdict =
87
95
 
88
96
  export type ApprovalPolicy = (call: ApprovalCall) => ApprovalVerdict | undefined;
89
97
 
98
+ /**
99
+ * 闸门的输入:`skipAsk` 为真表示会话已经不要审批提示(完全权限)—— 认领检查、`{blocked}` 与套件自己的
100
+ * `deny` 照旧,只是不再返回 `ask`;dsh 在 `approval: never` 下会把 `ask` 直接拒掉。
101
+ */
90
102
  export interface ApprovalContext {
91
103
  readonly writes?: boolean | undefined;
92
104
  readonly policy?: ApprovalPolicy | undefined;
93
105
  readonly declaredNote?: boolean | undefined;
106
+ readonly skipAsk?: boolean | undefined;
94
107
  readonly detailOf?:
95
108
  | ((call: ApprovalCall) => ApprovalFacts | undefined | Promise<ApprovalFacts | undefined>)
96
109
  | undefined;
@@ -134,6 +147,8 @@ export async function approvalFor(
134
147
 
135
148
  if (verdict?.kind === 'read' || verdict?.kind === 'allow') return undefined;
136
149
 
150
+ if (verdict?.kind === 'deny') return { kind: 'deny', reason: verdict.reason };
151
+
137
152
  if (verdict?.kind !== 'ask') {
138
153
  return {
139
154
  kind: 'deny',
@@ -151,6 +166,8 @@ export async function approvalFor(
151
166
  }
152
167
  if (facts !== undefined && 'blocked' in facts) return { kind: 'deny', reason: facts.blocked };
153
168
 
169
+ if (context.skipAsk === true) return undefined;
170
+
154
171
  return {
155
172
  kind: 'ask',
156
173
  reason: verdict.reason,
@@ -1,5 +1,5 @@
1
1
  import type { DshToolRunContext } from '../api/dsh.js';
2
- import { WorkbenchDataError } from './opencli.js';
2
+ import { WorkbenchDataError } from './data-error.js';
3
3
 
4
4
  export function sessionWorkspace(exec: DshToolRunContext | undefined): string | null {
5
5
  const cwd = exec?.agent?.session?.header?.cwd;
@@ -1,12 +1,13 @@
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';
10
11
 
11
12
  export interface ToolScopeContext {
12
13
  readonly workspace: string | null;
@@ -20,7 +21,7 @@ export interface UnitMountDeps {
20
21
  readonly manifests: () => readonly UnitManifest[];
21
22
  readonly ownedUnits: () => readonly string[];
22
23
  readonly installable?: (() => readonly string[]) | undefined;
23
- readonly opencliCommand?: string;
24
+ readonly data: DataReader;
24
25
  readonly store: WorkspaceStore;
25
26
  readonly values?: ValueHandoff | undefined;
26
27
  readonly probe?: (
@@ -0,0 +1,71 @@
1
+ import { compareVersions } from './version.js';
2
+
3
+ export type VersionVerdict = 'satisfied' | 'unsatisfied' | 'malformed';
4
+
5
+ function readable(version: string): boolean {
6
+ return compareVersions(version, '0.0.0') !== undefined;
7
+ }
8
+
9
+ function segmentsOf(version: string): number[] | undefined {
10
+ if (!readable(version)) return undefined;
11
+ return version.split('.').map((part) => Number.parseInt(part, 10));
12
+ }
13
+
14
+ function caretUpper(base: readonly number[]): string {
15
+ const [major = 0, minor = 0, patch = 0] = base;
16
+ if (major > 0) return `${major + 1}.0.0`;
17
+ return minor > 0 ? `0.${minor + 1}.0` : `0.0.${patch + 1}`;
18
+ }
19
+
20
+ function tildeUpper(base: readonly number[]): string {
21
+ const [major = 0, minor = 0] = base;
22
+ return `${major}.${minor + 1}.0`;
23
+ }
24
+
25
+ function comparator(token: string, version: string): boolean | undefined {
26
+ const match = /^(>=|<=|>|<|=|\^|~)?\s*(.+)$/.exec(token.trim());
27
+ if (match === null) return undefined;
28
+ const [, operator = '', raw = ''] = match;
29
+ const base = segmentsOf(raw.trim());
30
+ if (base === undefined) return undefined;
31
+ const at = (other: string): number | undefined => compareVersions(version, other);
32
+ switch (operator) {
33
+ case '^':
34
+ return (at(raw) ?? -1) >= 0 && (at(caretUpper(base)) ?? 1) < 0;
35
+ case '~':
36
+ return (at(raw) ?? -1) >= 0 && (at(tildeUpper(base)) ?? 1) < 0;
37
+ default:
38
+ break;
39
+ }
40
+ const compared = at(raw.trim());
41
+ if (compared === undefined) return undefined;
42
+ switch (operator) {
43
+ case '>=':
44
+ return compared >= 0;
45
+ case '<=':
46
+ return compared <= 0;
47
+ case '>':
48
+ return compared > 0;
49
+ case '<':
50
+ return compared < 0;
51
+ case '=':
52
+ case '':
53
+ return compared === 0;
54
+ default:
55
+ return undefined;
56
+ }
57
+ }
58
+
59
+ export function checkVersionRange(contract: string | undefined, version: string): VersionVerdict {
60
+ const spec = contract?.trim() ?? '';
61
+ if (spec === '') return 'satisfied';
62
+ if (!readable(version)) return 'malformed';
63
+ const tokens = spec.split(/\s+/).filter((token) => token !== '');
64
+ if (tokens.length === 0) return 'satisfied';
65
+ for (const token of tokens) {
66
+ const verdict = comparator(token, version);
67
+ if (verdict === undefined) return 'malformed';
68
+ if (!verdict) return 'unsatisfied';
69
+ }
70
+ return 'satisfied';
71
+ }
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from 'node:fs';
2
+
3
+ export function runningVersionOf(moduleUrl: string): string | undefined {
4
+ try {
5
+ const read = JSON.parse(readFileSync(new URL('../../package.json', moduleUrl), 'utf8')) as {
6
+ readonly version?: unknown;
7
+ };
8
+ return typeof read.version === 'string' && read.version !== '' ? read.version : undefined;
9
+ } catch {
10
+ return undefined;
11
+ }
12
+ }
13
+
14
+ export function compareVersions(a: string, b: string): number | undefined {
15
+ const na = a.split('.').map((part) => Number.parseInt(part, 10));
16
+ const nb = b.split('.').map((part) => Number.parseInt(part, 10));
17
+ if (na.some(Number.isNaN) || nb.some(Number.isNaN)) return undefined;
18
+ for (let index = 0; index < Math.max(na.length, nb.length); index += 1) {
19
+ const left = na[index] ?? 0;
20
+ const right = nb[index] ?? 0;
21
+ if (left !== right) return left > right ? 1 : -1;
22
+ }
23
+ return 0;
24
+ }
25
+
26
+ export function isNewerVersion(latest: string, installed: string): boolean {
27
+ if (latest === installed) return false;
28
+ const compared = compareVersions(latest, installed);
29
+ return compared === undefined ? true : compared > 0;
30
+ }
package/src/host.ts CHANGED
@@ -1,38 +1,69 @@
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/unit-board.js';
7
+ export * from './contract/workbench-contract.js';
8
+ export * from './contract/blocker.js';
9
+ export * from './contract/facts.js';
10
+ export * from './contract/long-task.js';
6
11
  export * from './lib/text.js';
7
12
  export * from './lib/ui.js';
8
13
  export * from './lib/board-fact.js';
9
14
  export * from './api/blocker-table.js';
15
+ export * from './contract/unit-declaration.js';
10
16
  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
17
  export * from './host/context-ref.js';
15
- export * from './host/data-root.js';
16
18
  export * from './host/diy-debug.js';
17
19
  export * from './host/diy-record.js';
18
20
  export * from './host/facts.js';
19
21
  export * from './host/git.js';
20
22
  export * from './host/http.js';
23
+ export * from './host/lib-capabilities.js';
21
24
  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
25
  export * from './host/panel-state.js';
26
26
  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';
27
+ export * from './host/time.js';
28
+ export * from './host/tokens.js';
31
29
  export * from './host/tool-approval.js';
32
30
  export * from './host/tool-kit.js';
33
- export * from './host/unit-declaration.js';
34
31
  export * from './host/unit-face.js';
35
- export * from './host/unit-libs.js';
36
32
  export * from './host/value-handoff.js';
37
33
  export * from './host/workspace-store.js';
38
34
  export * from './host/write-result.js';
35
+ export * from './host/cli-error.js';
36
+ export * from './host/data-root.js';
37
+ export * from './host/shell-text.js';
38
+ export * from './host/shell.js';
39
+ export * from './host/data-error.js';
40
+ export * from './host/provision.js';
41
+ export * from './host/channel-plugin.js';
42
+ export * from './host/recipe.js';
43
+ export * from './host/recipe-rules.js';
44
+ export * from './contract/unit-capability.js';
45
+ export * from './contract/plugin-source.js';
46
+ export * from './contract/cli.js';
47
+ export * from './host/cli.js';
48
+ export * from './host/command-name.js';
49
+ export * from './host/browser.js';
50
+ export * from './host/preflight.js';
51
+ export * from './host/platform.js';
52
+ export * from './host/profile-port.js';
53
+ export * from './host/supply-port.js';
54
+ export * from './host/version.js';
55
+ export * from './host/adapter-types.js';
56
+ export * from './host/paths.js';
57
+ export * from './host/plugin.js';
58
+ export * from './host/spec.js';
59
+ export * from './host/plugin-source.js';
60
+ export * from './host/lib-install.js';
61
+ export * from './host/supply-index.js';
62
+ export * from './host/patch.js';
63
+ export * from './host/adapters.js';
64
+ export * from './host/adapter-set.js';
65
+ export * from './host/needs.js';
66
+ export * from './host/port-types.js';
67
+ export * from './host/version-range.js';
68
+ export * from './host/market-index.js';
69
+ export * from './host/changelog.js';