@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
@@ -1,56 +1,66 @@
1
1
  import { quoteShellArg } from './shell-text.js';
2
- import { npmCacheDir, toolchainOpencliDir, vendorPeerLink, vendorPrefix } from '../host/opencli-runtime.js';
2
+ import { npmCacheDir, toolchainOpencliDir, vendorPeerLink, vendorPrefix } from './paths.js';
3
3
  function mergeLines(commands) {
4
- return commands
5
- .map((item) => item.optional === true ? `(${item.line} || true)` : item.line)
6
- .join(" && ");
4
+ return commands.map((item) => (item.optional === true ? `(${item.line} || true)` : item.line)).join(' && ');
7
5
  }
8
6
  function envValue(env, name) {
9
7
  const value = env[name]?.trim();
10
- return value === undefined || value === ""
11
- ? { ok: false }
12
- : { ok: true, value };
8
+ return value === undefined || value === '' ? { ok: false } : { ok: true, value };
13
9
  }
14
10
  export function npmRegistryOf(source, env) {
15
- const fromEnv = envValue(env, source.registryEnv);
16
- if (fromEnv.ok)
17
- return fromEnv;
11
+ const name = source.registryEnv ?? '';
12
+ if (name !== '') {
13
+ const fromEnv = envValue(env, name);
14
+ if (fromEnv.ok)
15
+ return fromEnv;
16
+ }
18
17
  const fallback = source.registryDefault?.trim();
19
- return fallback === undefined || fallback === ""
20
- ? { ok: false }
21
- : { ok: true, value: fallback };
18
+ if (fallback === undefined || fallback === '')
19
+ return { ok: false, env: name };
20
+ return { ok: true, value: fallback };
22
21
  }
23
22
  function installOne(command, spec) {
24
23
  const line = `${quoteShellArg(command)} plugin install ${quoteShellArg(spec)}`;
25
24
  return { ok: true, commands: [{ line }], line };
26
25
  }
26
+ function pluginPackageOf(source, plugin) {
27
+ if (source.kind === 'npm') {
28
+ const pkg = source.package?.trim() ?? '';
29
+ if (pkg !== '')
30
+ return pkg;
31
+ return plugin.trim() === '' ? '' : `opencli-plugin-${plugin.trim()}`;
32
+ }
33
+ if (source.kind === 'git')
34
+ return source.url.trim();
35
+ return '';
36
+ }
27
37
  function npmSource(source, env, options) {
28
38
  const registry = npmRegistryOf(source, env);
29
39
  if (!registry.ok)
30
- return { ok: false, problem: "env-missing", env: source.registryEnv };
31
- const name = source.package.trim();
32
- if (name === "")
33
- return { ok: false, problem: "malformed" };
34
- const { command = "opencli", plugin = "", version = "latest", mode = "install", } = options;
40
+ return { ok: false, problem: 'env-missing', env: registry.env };
41
+ const { command = 'opencli', plugin = '', version = 'latest', mode = 'install' } = options;
42
+ const name = pluginPackageOf(source, plugin);
43
+ if (name === '')
44
+ return { ok: false, problem: 'malformed' };
35
45
  const prefix = vendorPrefix();
36
46
  const dirInPrefix = `${prefix}/node_modules/${name}`;
37
47
  const peer = vendorPeerLink();
38
48
  const commands = [
39
49
  {
40
50
  line: [
41
- "npm i",
51
+ 'npm i',
42
52
  `--prefix ${quoteShellArg(prefix)}`,
43
53
  quoteShellArg(`${name}@${version}`),
44
54
  `--registry ${quoteShellArg(registry.value)}`,
45
55
  `--cache ${quoteShellArg(npmCacheDir())}`,
46
- ].join(" "),
56
+ ].join(' '),
47
57
  },
48
58
  {
49
59
  line: `rm -rf ${quoteShellArg(peer.dir)} && mkdir -p ${quoteShellArg(peer.parent)} && ln -s ${quoteShellArg(toolchainOpencliDir())} ${quoteShellArg(peer.dir)}`,
50
60
  },
51
61
  ];
52
- if (mode === "install") {
53
- if (plugin !== "") {
62
+ if (mode === 'install') {
63
+ if (plugin !== '') {
54
64
  commands.push({
55
65
  line: `${quoteShellArg(command)} plugin uninstall ${quoteShellArg(plugin)}`,
56
66
  optional: true,
@@ -64,18 +74,18 @@ function npmSource(source, env, options) {
64
74
  }
65
75
  export function resolvePluginSource(source, env, options = {}) {
66
76
  if (source === undefined)
67
- return { ok: false, problem: "not-declared" };
68
- const command = options.command ?? "opencli";
69
- if (source.kind === "git") {
77
+ return { ok: false, problem: 'not-declared' };
78
+ const command = options.command ?? 'opencli';
79
+ if (source.kind === 'git') {
70
80
  const url = source.url.trim();
71
- return url === ""
72
- ? { ok: false, problem: "malformed" }
73
- : installOne(command, url);
81
+ return url === '' ? { ok: false, problem: 'malformed' } : installOne(command, url);
74
82
  }
75
- if (source.kind === "npm")
83
+ if (source.kind === 'npm')
76
84
  return npmSource(source, env, options);
77
- const value = envValue(env, source.env);
78
- return value.ok
79
- ? installOne(command, value.value)
80
- : { ok: false, problem: "env-missing", env: source.env };
85
+ const value = source.env === undefined ? { ok: false } : envValue(env, source.env);
86
+ if (value.ok)
87
+ return installOne(command, value.value);
88
+ if (source.path !== undefined && source.path.trim() !== '')
89
+ return installOne(command, source.path.trim());
90
+ return { ok: false, problem: 'env-missing', env: source.env ?? '' };
81
91
  }
@@ -0,0 +1,4 @@
1
+ export declare const OPENCLI_MANIFEST_FILE = "opencli-plugin.json";
2
+ export declare function pluginAt(dir: string): {
3
+ readonly name?: string;
4
+ } | undefined;
@@ -0,0 +1,39 @@
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const OPENCLI_MANIFEST_FILE = 'opencli-plugin.json';
4
+ function asRecord(value) {
5
+ return typeof value === 'object' && value !== null ? value : undefined;
6
+ }
7
+ function isCommandFile(name) {
8
+ if (name.endsWith('.d.ts') || name.endsWith('.test.ts'))
9
+ return false;
10
+ if (name.endsWith('.d.js'))
11
+ return false;
12
+ return name.endsWith('.ts') || name.endsWith('.js');
13
+ }
14
+ function pluginManifestOf(dir) {
15
+ try {
16
+ const parsed = JSON.parse(readFileSync(join(dir, OPENCLI_MANIFEST_FILE), 'utf8'));
17
+ if (Array.isArray(parsed))
18
+ return undefined;
19
+ return asRecord(parsed);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ function hasCommandFile(dir) {
26
+ try {
27
+ return readdirSync(dir).some(isCommandFile);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export function pluginAt(dir) {
34
+ const manifest = pluginManifestOf(dir);
35
+ if (manifest === undefined || !hasCommandFile(dir))
36
+ return undefined;
37
+ const name = manifest.name;
38
+ return typeof name === 'string' && name.trim() !== '' ? { name: name.trim() } : {};
39
+ }
@@ -0,0 +1,191 @@
1
+ import type { DshHostContext, DshShell } from '../api/dsh.js';
2
+ import type { LibNeed, SupplySource } from '../contract/needs.js';
3
+ import type { NeedProbeInput, UnitCapability } from '../contract/unit-capability.js';
4
+ import type { WorkbenchSelfUpdate } from '../contract/protocol/bundle-install.js';
5
+ import type { BundleManager, InstalledModule, OpencliResolution, ProfileModule, ProfilePackage, RegistryNotebook, SelfUpdateRequest, SelfUpdateStart } from './adapter-types.js';
6
+ import type { PostResource, RouteHandler, RouteTable } from './http.js';
7
+ import type { PluginSourceOptions, ResolvedPluginSource } from './plugin-source.js';
8
+ export interface LoggerLike {
9
+ info?(message: string): void;
10
+ warn?(message: string): void;
11
+ }
12
+ export interface ProfilePort {
13
+ dirOf(ctx: DshHostContext): string | null;
14
+ dshPlugins(ctx: DshHostContext): RouteHandler;
15
+ selfUpdateView(root: string, profile: string): WorkbenchSelfUpdate | undefined;
16
+ }
17
+ export type SupplyPluginSource = ResolvedPluginSource;
18
+ export interface SupplyPackageRoute {
19
+ readonly kind: 'opencli-plugin' | 'dsh-bundle' | 'neither';
20
+ readonly pkg?: string;
21
+ readonly pluginName?: string;
22
+ }
23
+ export interface SupplyRelease {
24
+ readonly installed?: string;
25
+ readonly latest?: string;
26
+ readonly missing?: readonly string[];
27
+ }
28
+ export interface SupplyNpmRef {
29
+ readonly name: string;
30
+ readonly version?: string;
31
+ }
32
+ export interface SupplyPluginInstallOptions {
33
+ readonly spec: string;
34
+ readonly command: string;
35
+ readonly registry?: string | undefined;
36
+ readonly pluginName?: string | undefined;
37
+ }
38
+ export interface SupplyLatestOptions {
39
+ readonly shell: DshShell;
40
+ readonly name: string;
41
+ readonly registry: string;
42
+ readonly force?: boolean;
43
+ }
44
+ export interface SupplyMissingPartsOptions {
45
+ readonly shell: DshShell;
46
+ readonly registry: string;
47
+ readonly version: string;
48
+ readonly force?: boolean;
49
+ }
50
+ export interface SupplyProbeReleaseOptions {
51
+ readonly shell: DshShell;
52
+ readonly package: string;
53
+ readonly registry?: string | undefined;
54
+ readonly force?: boolean;
55
+ }
56
+ export interface EnvSupplyPort {
57
+ resolvePluginSource(source: SupplySource | undefined, env: Readonly<Record<string, string | undefined>>, options?: PluginSourceOptions): ResolvedPluginSource;
58
+ libInstallCommand(options: {
59
+ readonly need: LibNeed;
60
+ readonly source: Extract<SupplySource, {
61
+ kind: 'npm';
62
+ }>;
63
+ readonly version?: string | undefined;
64
+ }): string;
65
+ pluginInstallPlan(options: SupplyPluginInstallOptions): ResolvedPluginSource;
66
+ latestVersion(options: SupplyLatestOptions): Promise<string | undefined>;
67
+ missingReleaseParts(options: SupplyMissingPartsOptions): Promise<readonly string[]>;
68
+ probeRelease(options: SupplyProbeReleaseOptions): Promise<SupplyRelease | undefined>;
69
+ splitNpmSpec(spec: string): SupplyNpmRef | undefined;
70
+ }
71
+ export interface ModulePort {
72
+ isolatedHome(): string;
73
+ cliCatalogPath(): string;
74
+ vendorPluginsDir(): string;
75
+ opencliInstallCommand(): string;
76
+ profileDirOf(ctx: DshHostContext): string | null;
77
+ profileModules(dir: string | null): readonly ProfileModule[];
78
+ readInstalledModule(dir: string | null, pkg: string): InstalledModule;
79
+ readProfilePackage(dir: string | null, pkg: string): ProfilePackage | undefined;
80
+ readBundleManager(ctx: DshHostContext): BundleManager | undefined;
81
+ createRegistryNotebook(dir: string | null): RegistryNotebook;
82
+ declarationGaps(dir: string | null): readonly {
83
+ readonly pkg: string;
84
+ }[] | undefined;
85
+ moduleDeclarationOf(dir: string | null, pkg: string): unknown;
86
+ registryDeclarationOf(options: {
87
+ readonly shell: DshShell;
88
+ readonly name: string;
89
+ readonly registry: string;
90
+ readonly force?: boolean;
91
+ }): Promise<unknown>;
92
+ pathDeclarationOf(spec: string): unknown;
93
+ declarationRefusalOf(name: string, raw: unknown): readonly string[];
94
+ refusalReason(): string;
95
+ packageRouteOf(options: {
96
+ readonly spec: string;
97
+ readonly shell?: DshShell | undefined;
98
+ readonly registry?: string | undefined;
99
+ readonly force?: boolean;
100
+ }): Promise<SupplyPackageRoute | undefined>;
101
+ isNewerVersion(left: string, right: string): boolean;
102
+ startSelfUpdate(request: SelfUpdateRequest, onError: (message: string) => void): SelfUpdateStart;
103
+ }
104
+ export interface SupplyPort extends EnvSupplyPort, ModulePort {
105
+ readonly env: EnvSupplyPort;
106
+ readonly modules: ModulePort;
107
+ }
108
+ export interface ProbeUnitsOptions {
109
+ readonly shell: DshShell;
110
+ readonly runtimeCommands: Readonly<Record<string, string>>;
111
+ readonly units: readonly NeedProbeInput[];
112
+ readonly force?: boolean;
113
+ }
114
+ export interface ProbePreflightInput {
115
+ readonly routes: RouteTable;
116
+ readonly ctx: DshHostContext;
117
+ readonly shell: DshShell;
118
+ readonly opencliCommand: string;
119
+ readonly installCommand?: string | undefined;
120
+ readonly warmReads: () => readonly (readonly string[])[];
121
+ }
122
+ export interface ProbePort {
123
+ probeUnits(options: ProbeUnitsOptions): Promise<UnitCapability[]>;
124
+ registerPreflight(input: ProbePreflightInput): void;
125
+ declaredPluginCommands(profileDir: string | null): ReadonlyMap<string, ReadonlySet<string>>;
126
+ }
127
+ export interface RuntimeSeedOptions {
128
+ readonly corePackageUrl: string;
129
+ readonly log: (message: string) => void;
130
+ }
131
+ export interface RuntimePort {
132
+ packageRoot(moduleUrl: string): string;
133
+ opencliCommand(ctx: DshHostContext): OpencliResolution;
134
+ seed(ctx: DshHostContext, options: RuntimeSeedOptions): void;
135
+ warnUnwritableRoot(ctx: DshHostContext): void;
136
+ }
137
+ export interface PluginDeclarationSource {
138
+ readonly pkg: string;
139
+ readonly declaration: unknown;
140
+ }
141
+ export interface PluginRowRef {
142
+ readonly id: string;
143
+ readonly pkg: string;
144
+ readonly name?: string | undefined;
145
+ }
146
+ export interface PluginRowsSource {
147
+ listPlugins(workspace: string | null): readonly PluginRowRef[];
148
+ subscribe?(listener: () => void): () => void;
149
+ }
150
+ export interface PluginUnitsPort {
151
+ refresh(options?: {
152
+ readonly force?: boolean;
153
+ }): Promise<unknown>;
154
+ touch(): void;
155
+ report(): unknown;
156
+ dispose(): void;
157
+ }
158
+ export interface PluginUnitsInput {
159
+ readonly registry: {
160
+ registerPlugin(face: unknown): () => void;
161
+ };
162
+ readonly rows: () => readonly PluginRowRef[];
163
+ readonly declared: (plugin: string) => ReadonlySet<string>;
164
+ readonly toolNames?: () => ReadonlySet<string>;
165
+ readonly logger?: LoggerLike | undefined;
166
+ }
167
+ export interface PluginSurface {
168
+ declarationLookup(profileDir: string | null): (unit: string) => PluginDeclarationSource | undefined;
169
+ createUnits(input: PluginUnitsInput): PluginUnitsPort;
170
+ }
171
+ export interface ConfigSyncInput {
172
+ readonly home: string;
173
+ readonly self: string;
174
+ readonly profileDir: string | null;
175
+ readonly reconcile?: (() => Promise<boolean | void>) | undefined;
176
+ }
177
+ export interface ProfileCreateInput {
178
+ readonly home: string;
179
+ readonly self: string;
180
+ readonly packageRoot: string;
181
+ readonly runSetup?: ((env: Readonly<Record<string, string>>) => Promise<{
182
+ ok: boolean;
183
+ log: string;
184
+ }>) | undefined;
185
+ }
186
+ export interface HostActions {
187
+ configSyncHandler(input: ConfigSyncInput): RouteHandler;
188
+ profileCreateHandler(input: ProfileCreateInput): RouteHandler;
189
+ configSyncAction(input: ConfigSyncInput): PostResource;
190
+ profileCreateAction(input: ProfileCreateInput): PostResource;
191
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ export type PreflightStepId = 'toolchain' | 'opencli' | 'bridge' | 'diy' | 'warm';
2
+ export type PreflightStepStatus = 'pending' | 'running' | 'ok' | 'warn' | 'failed';
3
+ export type PreflightFailure = 'permission' | 'network' | 'missing' | 'unknown';
4
+ export type PreflightGuidance = 'install' | 'path' | 'shell';
5
+ export type PreflightBridgeIssue = 'daemon' | 'extension' | 'profile' | 'stale' | 'unknown';
6
+ export interface PreflightStep {
7
+ readonly id: PreflightStepId;
8
+ readonly status: PreflightStepStatus;
9
+ readonly detail?: string;
10
+ readonly action?: string;
11
+ readonly command?: string;
12
+ }
13
+ export interface PreflightDiyGap {
14
+ readonly rows: readonly string[];
15
+ readonly detail: string;
16
+ readonly command: string;
17
+ }
18
+ export interface PreflightSnapshot {
19
+ readonly phase: 'idle' | 'checking' | 'installing' | 'ready' | 'failed';
20
+ readonly steps: readonly PreflightStep[];
21
+ readonly at: number;
22
+ readonly error?: string;
23
+ readonly failure?: PreflightFailure;
24
+ readonly guidance?: PreflightGuidance;
25
+ readonly bridgeIssues?: readonly PreflightBridgeIssue[];
26
+ readonly diyGap?: PreflightDiyGap;
27
+ readonly canWakeBrowser?: boolean;
28
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { DshHostContext } from '../api/dsh.js';
2
+ import type { ProfilePort } from './port-types.js';
3
+ export type { ProfilePort } from './port-types.js';
4
+ export declare function profilePortOf(ctx: DshHostContext): ProfilePort;
@@ -0,0 +1,4 @@
1
+ import { adaptersOf } from './adapters.js';
2
+ export function profilePortOf(ctx) {
3
+ return adaptersOf(ctx).profile;
4
+ }
@@ -1,6 +1,6 @@
1
- import type { ProvisionAction } from '../api/workbench-contract.js';
1
+ import type { ProvisionAction } from '../contract/workbench-contract.js';
2
2
  export type { ProvisionAction };
3
- export declare const PROVISION_ACTIONS: readonly ["install", "update", "uninstall", "install-bundle", "update-bundle", "remove-bundle", "cancel-install", "update-dependency", "update-plugin", "uninstall-plugin", "update-workbench"];
3
+ export declare const PROVISION_ACTIONS: readonly ["install", "update", "uninstall", "install-bundle", "install-version", "update-bundle", "remove-bundle", "cancel-install", "update-dependency", "update-plugin", "uninstall-plugin", "update-workbench"];
4
4
  export declare const DEPENDENCY_ACTIONS: readonly ["update-dependency"];
5
5
  export declare function isDependencyAction(action: ProvisionAction): action is (typeof DEPENDENCY_ACTIONS)[number];
6
6
  export type ProvisionTarget = 'unit' | 'id' | 'spec' | 'name' | 'requestId';
@@ -3,6 +3,7 @@ export const PROVISION_ACTIONS = [
3
3
  'update',
4
4
  'uninstall',
5
5
  'install-bundle',
6
+ 'install-version',
6
7
  'update-bundle',
7
8
  'remove-bundle',
8
9
  'cancel-install',
@@ -20,7 +21,7 @@ void ALL_ACTIONS_COVERED;
20
21
  export function provisionTargetOf(action) {
21
22
  if (action === 'update-dependency')
22
23
  return 'id';
23
- if (action === 'install-bundle')
24
+ if (action === 'install-bundle' || action === 'install-version')
24
25
  return 'spec';
25
26
  if (action === 'remove-bundle')
26
27
  return 'name';
@@ -51,7 +52,7 @@ function stringsOf(value) {
51
52
  function requestOf(action, value) {
52
53
  if (action === 'update-dependency')
53
54
  return { action, id: value };
54
- if (action === 'install-bundle')
55
+ if (action === 'install-bundle' || action === 'install-version')
55
56
  return { action, spec: value };
56
57
  if (action === 'remove-bundle')
57
58
  return { action, name: value };
@@ -79,8 +80,9 @@ export function parseProvisionBody(body) {
79
80
  if (typeof value !== 'string' || value.trim() === '') {
80
81
  return { ok: false, code: TARGET_CODE[target], message: `缺少 ${target}` };
81
82
  }
82
- if (wanted !== 'install-bundle')
83
+ if (wanted !== 'install-bundle' && wanted !== 'install-version') {
83
84
  return { ok: true, request: requestOf(wanted, value.trim()) };
85
+ }
84
86
  const registry = typeof raw.registry === 'string' && raw.registry.trim() !== '' ? raw.registry.trim() : undefined;
85
87
  const approvedBuilds = stringsOf(raw.approvedBuilds);
86
88
  const requestId = typeof raw.requestId === 'string' && raw.requestId.trim() !== '' ? raw.requestId.trim() : undefined;
@@ -0,0 +1,5 @@
1
+ import type { CallOverrides } from '../contract/data.js';
2
+ export declare const DEFAULT_RECIPE_MAX_BYTES: number;
3
+ export declare const MAX_RECIPE_CALLS = 8;
4
+ export declare function recipeProblemOf(recipe: unknown, overrides?: CallOverrides): string | undefined;
5
+ export declare function callsProblemOf(recipe: unknown, calls: unknown): string | undefined;