@dsh-workbench/shared 0.3.11 → 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 (371) 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/LongTaskRow.css +1 -2
  22. package/dist/components/LongTaskRow.d.ts +1 -1
  23. package/dist/components/LongTaskRow.js +1 -1
  24. package/dist/components/Note.css +0 -1
  25. package/dist/components/ResourceStates.css +0 -1
  26. package/dist/components/SettingsSection.css +0 -1
  27. package/dist/components/Spinner.css +0 -1
  28. package/dist/components/Stack.css +0 -1
  29. package/dist/components/StateBlock.css +0 -1
  30. package/dist/components/board-module.d.ts +3 -3
  31. package/dist/components/icons.d.ts +1 -1
  32. package/dist/components/icons.js +11 -4
  33. package/dist/config/constants.d.ts +2 -2
  34. package/dist/config/constants.js +2 -2
  35. package/dist/contract/adapters.d.ts +10 -0
  36. package/dist/contract/cli.d.ts +3 -0
  37. package/dist/contract/data.d.ts +126 -0
  38. package/dist/{api → contract}/facts.d.ts +12 -3
  39. package/dist/{api → contract}/facts.js +19 -1
  40. package/dist/contract/needs.d.ts +132 -0
  41. package/dist/contract/needs.js +232 -0
  42. package/dist/contract/plugin-source.d.ts +1 -0
  43. package/dist/contract/protocol/bundle-install.d.ts +136 -0
  44. package/dist/contract/protocol/bundle-install.js +12 -0
  45. package/dist/contract/protocol/config-sync.d.ts +55 -0
  46. package/dist/contract/protocol/config-sync.js +2 -0
  47. package/dist/contract/protocol/diy.d.ts +4 -0
  48. package/dist/contract/protocol/diy.js +4 -0
  49. package/dist/contract/protocol/dsh-plugins.d.ts +11 -0
  50. package/dist/contract/protocol/dsh-plugins.js +1 -0
  51. package/dist/contract/protocol/long-tasks.d.ts +13 -0
  52. package/dist/contract/protocol/long-tasks.js +1 -0
  53. package/dist/contract/protocol/market-index.d.ts +195 -0
  54. package/dist/contract/protocol/market-index.js +7 -0
  55. package/dist/contract/protocol/platform.d.ts +44 -0
  56. package/dist/contract/protocol/platform.js +1 -0
  57. package/dist/contract/protocol/preflight-wake.d.ts +7 -0
  58. package/dist/contract/protocol/preflight-wake.js +1 -0
  59. package/dist/contract/protocol/profile-create.d.ts +30 -0
  60. package/dist/contract/protocol/profile-create.js +2 -0
  61. package/dist/contract/protocol/sidebar-edition.d.ts +14 -0
  62. package/dist/contract/protocol/sidebar-edition.js +2 -0
  63. package/dist/contract/protocol/unit-manifests.d.ts +6 -0
  64. package/dist/contract/protocol/unit-manifests.js +1 -0
  65. package/dist/contract/unit-board.js +1 -0
  66. package/dist/contract/unit-capability.d.ts +34 -0
  67. package/dist/contract/unit-capability.js +1 -0
  68. package/dist/{host → contract}/unit-declaration.d.ts +7 -5
  69. package/dist/{api → contract}/unit-declaration.js +19 -13
  70. package/dist/contract/unit.d.ts +57 -0
  71. package/dist/contract/unit.js +24 -0
  72. package/dist/contract/workbench-contract.d.ts +15 -0
  73. package/dist/contract/workbench-contract.js +1 -0
  74. package/dist/host/adapter-set.d.ts +26 -0
  75. package/dist/host/adapter-set.js +243 -0
  76. package/dist/host/adapter-types.d.ts +79 -0
  77. package/dist/host/adapter-types.js +23 -0
  78. package/dist/host/adapters.d.ts +22 -0
  79. package/dist/host/adapters.js +9 -0
  80. package/dist/host/browser.d.ts +3 -0
  81. package/dist/host/browser.js +3 -0
  82. package/dist/host/changelog.d.ts +21 -0
  83. package/dist/host/changelog.js +188 -0
  84. package/dist/host/channel-plugin.d.ts +15 -0
  85. package/dist/host/channel-plugin.js +42 -0
  86. package/dist/host/cli.d.ts +4 -0
  87. package/dist/host/cli.js +7 -0
  88. package/dist/host/command-name.d.ts +1 -0
  89. package/dist/host/command-name.js +14 -0
  90. package/dist/host/data-error.d.ts +13 -0
  91. package/dist/host/data-error.js +20 -0
  92. package/dist/host/data-root.js +3 -0
  93. package/dist/host/diy-debug.js +2 -1
  94. package/dist/host/diy-record.js +2 -1
  95. package/dist/host/facts.d.ts +1 -1
  96. package/dist/host/facts.js +3 -2
  97. package/dist/host/git.js +2 -2
  98. package/dist/host/http.js +1 -1
  99. package/dist/host/lib-capabilities.d.ts +22 -0
  100. package/dist/host/lib-capabilities.js +37 -0
  101. package/dist/host/lib-install.d.ts +9 -0
  102. package/dist/host/lib-install.js +10 -0
  103. package/dist/host/long-task.d.ts +1 -1
  104. package/dist/host/long-task.js +4 -3
  105. package/dist/host/market-index.d.ts +22 -0
  106. package/dist/host/market-index.js +420 -0
  107. package/dist/host/needs.d.ts +4 -0
  108. package/dist/host/needs.js +2 -0
  109. package/dist/host/patch.d.ts +9 -0
  110. package/dist/host/patch.js +78 -0
  111. package/dist/host/paths.d.ts +12 -0
  112. package/dist/host/paths.js +28 -0
  113. package/dist/host/platform.d.ts +14 -0
  114. package/dist/host/platform.js +40 -0
  115. package/dist/host/plugin-source.d.ts +8 -6
  116. package/dist/host/plugin-source.js +43 -33
  117. package/dist/host/plugin.d.ts +4 -0
  118. package/dist/host/plugin.js +39 -0
  119. package/dist/host/port-types.d.ts +191 -0
  120. package/dist/host/port-types.js +1 -0
  121. package/dist/host/preflight.d.ts +28 -0
  122. package/dist/host/preflight.js +1 -0
  123. package/dist/host/profile-port.d.ts +4 -0
  124. package/dist/host/profile-port.js +4 -0
  125. package/dist/host/provision.d.ts +2 -2
  126. package/dist/host/provision.js +5 -3
  127. package/dist/host/recipe-rules.d.ts +5 -0
  128. package/dist/host/recipe-rules.js +382 -0
  129. package/dist/host/recipe.d.ts +14 -0
  130. package/dist/host/recipe.js +283 -0
  131. package/dist/host/shell-text.d.ts +9 -2
  132. package/dist/host/shell-text.js +15 -3
  133. package/dist/host/shell.d.ts +2 -0
  134. package/dist/host/shell.js +7 -0
  135. package/dist/host/spec.d.ts +8 -0
  136. package/dist/host/spec.js +24 -0
  137. package/dist/host/supply-index.d.ts +34 -0
  138. package/dist/host/supply-index.js +202 -0
  139. package/dist/host/supply-port.d.ts +5 -0
  140. package/dist/host/supply-port.js +39 -0
  141. package/dist/host/time.d.ts +12 -0
  142. package/dist/host/time.js +19 -0
  143. package/dist/host/tokens.d.ts +26 -0
  144. package/dist/host/tokens.js +154 -0
  145. package/dist/host/tool-kit.js +1 -1
  146. package/dist/host/unit-face.d.ts +5 -4
  147. package/dist/host/version-range.d.ts +2 -0
  148. package/dist/host/version-range.js +73 -0
  149. package/dist/host/version.d.ts +3 -0
  150. package/dist/host/version.js +29 -0
  151. package/dist/host.d.ts +47 -16
  152. package/dist/host.js +47 -16
  153. package/dist/i18n/en.js +224 -71
  154. package/dist/i18n/index.d.ts +298 -73
  155. package/dist/i18n/merge.js +1 -1
  156. package/dist/i18n/need-text.d.ts +26 -0
  157. package/dist/i18n/need-text.js +26 -0
  158. package/dist/i18n/settings.d.ts +70 -0
  159. package/dist/i18n/settings.js +136 -0
  160. package/dist/i18n/zh.d.ts +297 -72
  161. package/dist/i18n/zh.js +226 -73
  162. package/dist/index.d.ts +23 -7
  163. package/dist/index.js +23 -7
  164. package/dist/{api → lib}/dsh-client.d.ts +11 -1
  165. package/dist/lib/dsh-client.js +1 -0
  166. package/dist/lib/market-index.d.ts +7 -0
  167. package/dist/lib/market-index.js +25 -0
  168. package/dist/lib/react.d.ts +0 -40
  169. package/dist/lib/react.js +0 -36
  170. package/dist/lib/ui.js +3 -9
  171. package/dist/testing/data.d.ts +13 -0
  172. package/dist/testing/data.js +46 -0
  173. package/dist/testing/declaration.d.ts +1 -1
  174. package/dist/testing/declaration.js +1 -1
  175. package/dist/testing/host-fakes.d.ts +0 -13
  176. package/dist/testing/host-fakes.js +0 -24
  177. package/dist/testing/needs.d.ts +16 -0
  178. package/dist/testing/needs.js +46 -0
  179. package/dist/testing.d.ts +2 -0
  180. package/dist/testing.js +2 -0
  181. package/package.json +18 -2
  182. package/src/api/__tests__/blocker-table.test.ts +135 -86
  183. package/src/api/blocker-table.ts +52 -26
  184. package/src/api/dsh.ts +1 -1
  185. package/src/api/host-write.ts +0 -1
  186. package/src/api/workbench-client.test.ts +2 -2
  187. package/src/api/workbench-client.ts +2 -1
  188. package/src/components/Activity.css +0 -1
  189. package/src/components/ApprovalDetail.css +1 -2
  190. package/src/components/ApprovalDetail.tsx +1 -1
  191. package/src/components/ApprovalPlan.css +0 -1
  192. package/src/components/Card.css +0 -1
  193. package/src/components/Card.tsx +1 -1
  194. package/src/components/CardAnchor.test.tsx +1 -1
  195. package/src/components/CardBoundary.tsx +1 -1
  196. package/src/components/CardHead.css +0 -1
  197. package/src/components/CardHead.tsx +1 -1
  198. package/src/components/ChoiceGroup.css +1 -2
  199. package/src/components/ConfirmBar.tsx +1 -1
  200. package/src/components/Form.css +1 -1
  201. package/src/components/Form.tsx +1 -1
  202. package/src/components/FormActions.tsx +1 -1
  203. package/src/components/LongTaskRow.css +1 -2
  204. package/src/components/LongTaskRow.tsx +1 -1
  205. package/src/components/Note.css +0 -1
  206. package/src/components/ResourceStates.css +0 -1
  207. package/src/components/SelectFieldNodes.tsx +0 -1
  208. package/src/components/SettingsSection.css +0 -1
  209. package/src/components/Spinner.css +0 -1
  210. package/src/components/Stack.css +0 -1
  211. package/src/components/StateBlock.css +0 -1
  212. package/src/components/__tests__/long-task-row.test.ts +1 -1
  213. package/src/components/board-module.ts +3 -3
  214. package/src/components/icons.tsx +16 -8
  215. package/src/config/constants.ts +2 -2
  216. package/src/{api → contract}/__tests__/facts.test.ts +73 -25
  217. package/src/{api → contract}/__tests__/long-task.test.ts +3 -3
  218. package/src/contract/__tests__/needs.test.ts +74 -0
  219. package/src/{host → contract}/__tests__/unit-declaration.test.ts +1 -1
  220. package/src/contract/__tests__/unit.test.ts +43 -0
  221. package/src/contract/adapters.ts +9 -0
  222. package/src/contract/cli.ts +3 -0
  223. package/src/contract/data.ts +145 -0
  224. package/src/{api → contract}/facts.ts +34 -4
  225. package/src/contract/needs.ts +331 -0
  226. package/src/contract/plugin-source.ts +1 -0
  227. package/src/contract/protocol/bundle-install.ts +198 -0
  228. package/src/contract/protocol/config-sync.ts +65 -0
  229. package/src/contract/protocol/diy.ts +4 -0
  230. package/src/contract/protocol/dsh-plugins.ts +13 -0
  231. package/src/contract/protocol/long-tasks.ts +16 -0
  232. package/src/contract/protocol/market-index.ts +246 -0
  233. package/src/contract/protocol/platform.ts +47 -0
  234. package/src/contract/protocol/preflight-wake.ts +17 -0
  235. package/src/contract/protocol/profile-create.ts +36 -0
  236. package/src/contract/protocol/sidebar-edition.ts +19 -0
  237. package/src/contract/protocol/unit-manifests.ts +8 -0
  238. package/src/{api → contract}/unit-board.ts +0 -1
  239. package/src/contract/unit-capability.ts +37 -0
  240. package/src/{host → contract}/unit-declaration.ts +22 -18
  241. package/src/contract/unit.ts +76 -0
  242. package/src/contract/workbench-contract.ts +30 -0
  243. package/src/host/__tests__/adapter-set.test.ts +228 -0
  244. package/src/host/__tests__/adapters.test.ts +27 -0
  245. package/src/host/__tests__/changelog.test.ts +102 -0
  246. package/src/host/__tests__/command-name.test.ts +16 -0
  247. package/src/host/__tests__/diy-record.test.ts +3 -3
  248. package/src/host/__tests__/facts.test.ts +5 -5
  249. package/src/host/__tests__/long-task.test.ts +1 -1
  250. package/src/host/__tests__/market-index.test.ts +179 -0
  251. package/src/host/__tests__/plugin-ledger.test.ts +10 -10
  252. package/src/host/__tests__/provision.test.ts +7 -6
  253. package/src/host/__tests__/shell-text.test.ts +16 -1
  254. package/src/host/__tests__/supply-index.test.ts +137 -0
  255. package/src/host/__tests__/tokens.test.ts +110 -0
  256. package/src/host/__tests__/version-range.test.ts +21 -0
  257. package/src/host/adapter-set.ts +298 -0
  258. package/src/host/adapter-types.ts +105 -0
  259. package/src/host/adapters.ts +44 -0
  260. package/src/host/browser.ts +3 -0
  261. package/src/host/changelog.ts +212 -0
  262. package/src/host/channel-plugin.ts +55 -0
  263. package/src/host/cli.ts +11 -0
  264. package/src/host/command-name.ts +15 -0
  265. package/src/host/data-error.ts +21 -0
  266. package/src/host/data-root.ts +2 -0
  267. package/src/host/diy-debug.ts +2 -1
  268. package/src/host/diy-record.ts +2 -1
  269. package/src/host/facts.ts +4 -3
  270. package/src/host/git.ts +2 -2
  271. package/src/host/http.ts +1 -1
  272. package/src/host/lib-capabilities.ts +52 -0
  273. package/src/host/lib-install.ts +18 -0
  274. package/src/host/long-task.ts +4 -3
  275. package/src/host/market-index.ts +413 -0
  276. package/src/host/needs.ts +6 -0
  277. package/src/host/patch.ts +93 -0
  278. package/src/host/paths.ts +37 -0
  279. package/src/host/platform.ts +48 -0
  280. package/src/host/plugin-source.ts +48 -56
  281. package/src/host/plugin.ts +39 -0
  282. package/src/host/port-types.ts +222 -0
  283. package/src/host/preflight.ts +31 -0
  284. package/src/host/profile-port.ts +9 -0
  285. package/src/host/provision.ts +7 -4
  286. package/src/host/recipe-rules.ts +330 -0
  287. package/src/host/recipe.test.ts +334 -0
  288. package/src/host/recipe.ts +323 -0
  289. package/src/host/shell-text.ts +15 -3
  290. package/src/host/shell.ts +9 -0
  291. package/src/host/spec.ts +32 -0
  292. package/src/host/supply-index.ts +256 -0
  293. package/src/host/supply-port.ts +45 -0
  294. package/src/host/time.ts +22 -0
  295. package/src/host/tokens.ts +186 -0
  296. package/src/host/tool-kit.ts +1 -1
  297. package/src/host/unit-face.ts +5 -4
  298. package/src/host/version-range.ts +71 -0
  299. package/src/host/version.ts +30 -0
  300. package/src/host.ts +47 -16
  301. package/src/i18n/en.ts +224 -71
  302. package/src/i18n/merge.test.ts +6 -6
  303. package/src/i18n/merge.ts +1 -1
  304. package/src/i18n/need-text.ts +27 -0
  305. package/src/i18n/settings.ts +141 -0
  306. package/src/i18n/zh.ts +227 -73
  307. package/src/index.ts +23 -7
  308. package/src/lib/blocker-action.ts +0 -1
  309. package/src/{api → lib}/dsh-client.ts +12 -1
  310. package/src/lib/market-index.ts +36 -0
  311. package/src/lib/react.ts +0 -40
  312. package/src/lib/text.test.ts +2 -2
  313. package/src/lib/ui.test.ts +6 -5
  314. package/src/lib/ui.ts +3 -9
  315. package/src/testing/__tests__/declaration.test.ts +1 -1
  316. package/src/testing/data.ts +66 -0
  317. package/src/testing/declaration.ts +2 -2
  318. package/src/testing/host-fakes.ts +0 -38
  319. package/src/testing/needs.ts +80 -0
  320. package/src/testing.ts +2 -0
  321. package/dist/api/unit-declaration.d.ts +0 -65
  322. package/dist/api/unit.d.ts +0 -85
  323. package/dist/api/unit.js +0 -8
  324. package/dist/api/workbench-contract.d.ts +0 -44
  325. package/dist/components/MockStrip.css +0 -39
  326. package/dist/components/MockStrip.d.ts +0 -15
  327. package/dist/components/MockStrip.js +0 -8
  328. package/dist/components/SaveBar.css +0 -7
  329. package/dist/host/browser-find.d.ts +0 -38
  330. package/dist/host/browser-find.js +0 -242
  331. package/dist/host/browser-read.d.ts +0 -28
  332. package/dist/host/browser-read.js +0 -243
  333. package/dist/host/opencli-runtime.d.ts +0 -25
  334. package/dist/host/opencli-runtime.js +0 -56
  335. package/dist/host/opencli-window.d.ts +0 -2
  336. package/dist/host/opencli-window.js +0 -8
  337. package/dist/host/opencli.d.ts +0 -37
  338. package/dist/host/opencli.js +0 -155
  339. package/dist/host/unit-declaration.js +0 -213
  340. package/dist/host/unit-libs.d.ts +0 -37
  341. package/dist/lib/diy-debug.d.ts +0 -80
  342. package/dist/lib/diy-debug.js +0 -88
  343. package/dist/lib/diy-record.d.ts +0 -135
  344. package/dist/lib/diy-record.js +0 -162
  345. package/dist/lib/lint-probe.d.ts +0 -1
  346. package/dist/lib/lint-probe.js +0 -6
  347. package/dist/lib/panel-state.d.ts +0 -120
  348. package/dist/lib/panel-state.js +0 -176
  349. package/src/api/__tests__/unit.test.ts +0 -38
  350. package/src/api/unit.ts +0 -93
  351. package/src/api/workbench-contract.ts +0 -59
  352. package/src/host/__tests__/browser-find.test.ts +0 -330
  353. package/src/host/__tests__/browser-read.test.ts +0 -228
  354. package/src/host/__tests__/opencli-runtime.test.ts +0 -46
  355. package/src/host/browser-find.ts +0 -311
  356. package/src/host/browser-read.ts +0 -311
  357. package/src/host/opencli-runtime.ts +0 -79
  358. package/src/host/opencli-window.ts +0 -11
  359. package/src/host/opencli.ts +0 -213
  360. package/src/host/unit-libs.ts +0 -41
  361. /package/dist/{api/blocker.js → contract/adapters.js} +0 -0
  362. /package/dist/{api → contract}/blocker.d.ts +0 -0
  363. /package/dist/{api/dsh-client.js → contract/blocker.js} +0 -0
  364. /package/dist/{api/unit-board.js → contract/cli.js} +0 -0
  365. /package/dist/{api/workbench-contract.js → contract/data.js} +0 -0
  366. /package/dist/{api → contract}/long-task.d.ts +0 -0
  367. /package/dist/{api → contract}/long-task.js +0 -0
  368. /package/dist/{host/unit-libs.js → contract/plugin-source.js} +0 -0
  369. /package/dist/{api → contract}/unit-board.d.ts +0 -0
  370. /package/src/{api → contract}/blocker.ts +0 -0
  371. /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,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';