every-plugin 2.10.1 → 3.0.0-rc.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 (462) hide show
  1. package/bin/every-plugin-serve.mjs +12 -0
  2. package/bin/every-plugin.mjs +59 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -2
  4. package/dist/build/artifact-names.cjs +119 -0
  5. package/dist/build/artifact-names.cjs.map +1 -0
  6. package/dist/build/artifact-names.d.cts +68 -0
  7. package/dist/build/artifact-names.d.cts.map +1 -0
  8. package/dist/build/artifact-names.d.mts +68 -0
  9. package/dist/build/artifact-names.d.mts.map +1 -0
  10. package/dist/build/artifact-names.mjs +102 -0
  11. package/dist/build/artifact-names.mjs.map +1 -0
  12. package/dist/build/contract-types.cjs +89 -0
  13. package/dist/build/contract-types.cjs.map +1 -0
  14. package/dist/build/contract-types.mjs +81 -0
  15. package/dist/build/contract-types.mjs.map +1 -0
  16. package/dist/build/rspack/build-report-plugin.cjs +37 -0
  17. package/dist/build/rspack/build-report-plugin.cjs.map +1 -0
  18. package/dist/build/rspack/build-report-plugin.d.cts +18 -0
  19. package/dist/build/rspack/build-report-plugin.d.cts.map +1 -0
  20. package/dist/build/rspack/build-report-plugin.d.mts +18 -0
  21. package/dist/build/rspack/build-report-plugin.d.mts.map +1 -0
  22. package/dist/build/rspack/build-report-plugin.mjs +37 -0
  23. package/dist/build/rspack/build-report-plugin.mjs.map +1 -0
  24. package/dist/build/rspack/chunk-completeness-plugin.cjs +47 -0
  25. package/dist/build/rspack/chunk-completeness-plugin.cjs.map +1 -0
  26. package/dist/build/rspack/chunk-completeness-plugin.mjs +47 -0
  27. package/dist/build/rspack/chunk-completeness-plugin.mjs.map +1 -0
  28. package/dist/build/rspack/compose.cjs +69 -0
  29. package/dist/build/rspack/compose.cjs.map +1 -0
  30. package/dist/build/rspack/compose.d.cts +20 -0
  31. package/dist/build/rspack/compose.d.cts.map +1 -0
  32. package/dist/build/rspack/compose.d.mts +20 -0
  33. package/dist/build/rspack/compose.d.mts.map +1 -0
  34. package/dist/build/rspack/compose.mjs +65 -0
  35. package/dist/build/rspack/compose.mjs.map +1 -0
  36. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs +11 -11
  37. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs.map +1 -1
  38. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts +2 -0
  39. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts.map +1 -1
  40. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts +2 -0
  41. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts.map +1 -1
  42. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs +11 -10
  43. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs.map +1 -1
  44. package/dist/build/rspack/generated-config.cjs +35 -0
  45. package/dist/build/rspack/generated-config.cjs.map +1 -0
  46. package/dist/build/rspack/generated-config.mjs +32 -0
  47. package/dist/build/rspack/generated-config.mjs.map +1 -0
  48. package/dist/build/rspack/index.cjs +8 -5
  49. package/dist/build/rspack/index.d.cts +5 -3
  50. package/dist/build/rspack/index.d.mts +5 -3
  51. package/dist/build/rspack/index.mjs +5 -3
  52. package/dist/build/rspack/module-federation.cjs +2 -2
  53. package/dist/build/rspack/module-federation.cjs.map +1 -1
  54. package/dist/build/rspack/module-federation.mjs +1 -1
  55. package/dist/build/rspack/module-federation.mjs.map +1 -1
  56. package/dist/build/rspack/plugin.cjs +44 -69
  57. package/dist/build/rspack/plugin.cjs.map +1 -1
  58. package/dist/build/rspack/plugin.d.cts +4 -13
  59. package/dist/build/rspack/plugin.d.cts.map +1 -1
  60. package/dist/build/rspack/plugin.d.mts +4 -13
  61. package/dist/build/rspack/plugin.d.mts.map +1 -1
  62. package/dist/build/rspack/plugin.mjs +44 -69
  63. package/dist/build/rspack/plugin.mjs.map +1 -1
  64. package/dist/build/rspack/utils.cjs +7 -5
  65. package/dist/build/rspack/utils.cjs.map +1 -1
  66. package/dist/build/rspack/utils.mjs +7 -6
  67. package/dist/build/rspack/utils.mjs.map +1 -1
  68. package/dist/build/ui/factory.cjs +88 -0
  69. package/dist/build/ui/factory.cjs.map +1 -0
  70. package/dist/build/ui/factory.d.cts +11 -0
  71. package/dist/build/ui/factory.d.cts.map +1 -0
  72. package/dist/build/ui/factory.d.mts +11 -0
  73. package/dist/build/ui/factory.d.mts.map +1 -0
  74. package/dist/build/ui/factory.mjs +80 -0
  75. package/dist/build/ui/factory.mjs.map +1 -0
  76. package/dist/build/ui/generated-config.cjs +118 -0
  77. package/dist/build/ui/generated-config.cjs.map +1 -0
  78. package/dist/build/ui/generated-config.d.cts +33 -0
  79. package/dist/build/ui/generated-config.d.cts.map +1 -0
  80. package/dist/build/ui/generated-config.d.mts +33 -0
  81. package/dist/build/ui/generated-config.d.mts.map +1 -0
  82. package/dist/build/ui/generated-config.mjs +111 -0
  83. package/dist/build/ui/generated-config.mjs.map +1 -0
  84. package/dist/build/ui/hash-artifacts-plugin.cjs +61 -0
  85. package/dist/build/ui/hash-artifacts-plugin.cjs.map +1 -0
  86. package/dist/build/ui/hash-artifacts-plugin.d.cts +20 -0
  87. package/dist/build/ui/hash-artifacts-plugin.d.cts.map +1 -0
  88. package/dist/build/ui/hash-artifacts-plugin.d.mts +20 -0
  89. package/dist/build/ui/hash-artifacts-plugin.d.mts.map +1 -0
  90. package/dist/build/ui/hash-artifacts-plugin.mjs +58 -0
  91. package/dist/build/ui/hash-artifacts-plugin.mjs.map +1 -0
  92. package/dist/build/ui/index.cjs +90 -0
  93. package/dist/build/ui/index.cjs.map +1 -0
  94. package/dist/build/ui/index.d.cts +29 -0
  95. package/dist/build/ui/index.d.cts.map +1 -0
  96. package/dist/build/ui/index.d.mts +29 -0
  97. package/dist/build/ui/index.d.mts.map +1 -0
  98. package/dist/build/ui/index.mjs +68 -0
  99. package/dist/build/ui/index.mjs.map +1 -0
  100. package/dist/build/ui/manifest-plugin.cjs +37 -0
  101. package/dist/build/ui/manifest-plugin.cjs.map +1 -0
  102. package/dist/build/ui/manifest-plugin.d.cts +19 -0
  103. package/dist/build/ui/manifest-plugin.d.cts.map +1 -0
  104. package/dist/build/ui/manifest-plugin.d.mts +19 -0
  105. package/dist/build/ui/manifest-plugin.d.mts.map +1 -0
  106. package/dist/build/ui/manifest-plugin.mjs +37 -0
  107. package/dist/build/ui/manifest-plugin.mjs.map +1 -0
  108. package/dist/build/ui/rsbuild-config.cjs +203 -0
  109. package/dist/build/ui/rsbuild-config.cjs.map +1 -0
  110. package/dist/build/ui/rsbuild-config.d.cts +45 -0
  111. package/dist/build/ui/rsbuild-config.d.cts.map +1 -0
  112. package/dist/build/ui/rsbuild-config.d.mts +45 -0
  113. package/dist/build/ui/rsbuild-config.d.mts.map +1 -0
  114. package/dist/build/ui/rsbuild-config.mjs +200 -0
  115. package/dist/build/ui/rsbuild-config.mjs.map +1 -0
  116. package/dist/build/ui/stubs.cjs +107 -0
  117. package/dist/build/ui/stubs.cjs.map +1 -0
  118. package/dist/build/ui/stubs.d.cts +25 -0
  119. package/dist/build/ui/stubs.d.cts.map +1 -0
  120. package/dist/build/ui/stubs.d.mts +25 -0
  121. package/dist/build/ui/stubs.d.mts.map +1 -0
  122. package/dist/build/ui/stubs.mjs +106 -0
  123. package/dist/build/ui/stubs.mjs.map +1 -0
  124. package/dist/cli.cjs +83 -0
  125. package/dist/cli.cjs.map +1 -0
  126. package/dist/cli.d.cts +6 -0
  127. package/dist/cli.d.cts.map +1 -0
  128. package/dist/cli.d.mts +6 -0
  129. package/dist/cli.d.mts.map +1 -0
  130. package/dist/cli.mjs +82 -0
  131. package/dist/cli.mjs.map +1 -0
  132. package/dist/dev/serve.cjs +390 -0
  133. package/dist/dev/serve.cjs.map +1 -0
  134. package/dist/dev/serve.d.cts +23 -0
  135. package/dist/dev/serve.d.cts.map +1 -0
  136. package/dist/dev/serve.d.mts +23 -0
  137. package/dist/dev/serve.d.mts.map +1 -0
  138. package/dist/dev/serve.mjs +384 -0
  139. package/dist/dev/serve.mjs.map +1 -0
  140. package/dist/dev/watch-kill.cjs +39 -0
  141. package/dist/dev/watch-kill.cjs.map +1 -0
  142. package/dist/dev/watch-kill.mjs +38 -0
  143. package/dist/dev/watch-kill.mjs.map +1 -0
  144. package/dist/effect-helpers.cjs +23 -0
  145. package/dist/effect-helpers.cjs.map +1 -0
  146. package/dist/effect-helpers.d.cts +20 -0
  147. package/dist/effect-helpers.d.cts.map +1 -0
  148. package/dist/effect-helpers.d.mts +20 -0
  149. package/dist/effect-helpers.d.mts.map +1 -0
  150. package/dist/effect-helpers.mjs +22 -0
  151. package/dist/effect-helpers.mjs.map +1 -0
  152. package/dist/errors.cjs +49 -69
  153. package/dist/errors.cjs.map +1 -1
  154. package/dist/errors.d.cts +13 -96
  155. package/dist/errors.d.cts.map +1 -1
  156. package/dist/errors.d.mts +13 -96
  157. package/dist/errors.d.mts.map +1 -1
  158. package/dist/errors.mjs +16 -34
  159. package/dist/errors.mjs.map +1 -1
  160. package/dist/identity.cjs +19 -0
  161. package/dist/identity.cjs.map +1 -0
  162. package/dist/identity.d.cts +33 -0
  163. package/dist/identity.d.cts.map +1 -0
  164. package/dist/identity.d.mts +33 -0
  165. package/dist/identity.d.mts.map +1 -0
  166. package/dist/identity.mjs +16 -0
  167. package/dist/identity.mjs.map +1 -0
  168. package/dist/index.cjs +8 -5
  169. package/dist/index.d.cts +8 -6
  170. package/dist/index.d.mts +8 -6
  171. package/dist/index.mjs +6 -4
  172. package/dist/plugin.cjs +12 -26
  173. package/dist/plugin.cjs.map +1 -1
  174. package/dist/plugin.d.cts +44 -25
  175. package/dist/plugin.d.cts.map +1 -1
  176. package/dist/plugin.d.mts +45 -26
  177. package/dist/plugin.d.mts.map +1 -1
  178. package/dist/plugin.mjs +15 -29
  179. package/dist/plugin.mjs.map +1 -1
  180. package/dist/remote-entry.cjs +103 -0
  181. package/dist/remote-entry.cjs.map +1 -0
  182. package/dist/remote-entry.d.cts +53 -0
  183. package/dist/remote-entry.d.cts.map +1 -0
  184. package/dist/remote-entry.d.mts +53 -0
  185. package/dist/remote-entry.d.mts.map +1 -0
  186. package/dist/remote-entry.mjs +98 -0
  187. package/dist/remote-entry.mjs.map +1 -0
  188. package/dist/runtime/errors.cjs +140 -34
  189. package/dist/runtime/errors.cjs.map +1 -1
  190. package/dist/runtime/errors.d.cts +42 -7
  191. package/dist/runtime/errors.d.cts.map +1 -1
  192. package/dist/runtime/errors.d.mts +42 -7
  193. package/dist/runtime/errors.d.mts.map +1 -1
  194. package/dist/runtime/errors.mjs +136 -31
  195. package/dist/runtime/errors.mjs.map +1 -1
  196. package/dist/runtime/index.cjs +95 -23
  197. package/dist/runtime/index.cjs.map +1 -1
  198. package/dist/runtime/index.d.cts +16 -0
  199. package/dist/runtime/index.d.cts.map +1 -1
  200. package/dist/runtime/index.d.mts +16 -0
  201. package/dist/runtime/index.d.mts.map +1 -1
  202. package/dist/runtime/index.mjs +98 -26
  203. package/dist/runtime/index.mjs.map +1 -1
  204. package/dist/runtime/mf-config.cjs +3 -78
  205. package/dist/runtime/mf-config.cjs.map +1 -1
  206. package/dist/runtime/mf-config.d.cts +3 -49
  207. package/dist/runtime/mf-config.d.cts.map +1 -1
  208. package/dist/runtime/mf-config.d.mts +3 -49
  209. package/dist/runtime/mf-config.d.mts.map +1 -1
  210. package/dist/runtime/mf-config.mjs +5 -78
  211. package/dist/runtime/mf-config.mjs.map +1 -1
  212. package/dist/runtime/services/module-federation.service.cjs +63 -12
  213. package/dist/runtime/services/module-federation.service.cjs.map +1 -1
  214. package/dist/runtime/services/module-federation.service.d.cts +4 -13
  215. package/dist/runtime/services/module-federation.service.d.mts +4 -13
  216. package/dist/runtime/services/module-federation.service.mjs +63 -14
  217. package/dist/runtime/services/module-federation.service.mjs.map +1 -1
  218. package/dist/runtime/services/normalize.cjs +2 -22
  219. package/dist/runtime/services/normalize.d.cts +2 -21
  220. package/dist/runtime/services/normalize.d.mts +2 -21
  221. package/dist/runtime/services/normalize.mjs +2 -21
  222. package/dist/runtime/services/plugin-lifecycle.service.cjs +9 -11
  223. package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -1
  224. package/dist/runtime/services/plugin-lifecycle.service.d.cts +3 -16
  225. package/dist/runtime/services/plugin-lifecycle.service.d.mts +3 -16
  226. package/dist/runtime/services/plugin-lifecycle.service.mjs +10 -13
  227. package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -1
  228. package/dist/runtime/services/plugin-loader.service.cjs +30 -29
  229. package/dist/runtime/services/plugin-loader.service.cjs.map +1 -1
  230. package/dist/runtime/services/plugin-loader.service.d.cts +6 -53
  231. package/dist/runtime/services/plugin-loader.service.d.mts +6 -53
  232. package/dist/runtime/services/plugin-loader.service.mjs +29 -30
  233. package/dist/runtime/services/plugin-loader.service.mjs.map +1 -1
  234. package/dist/runtime/services/plugin.service.cjs +10 -12
  235. package/dist/runtime/services/plugin.service.cjs.map +1 -1
  236. package/dist/runtime/services/plugin.service.d.cts +14 -36
  237. package/dist/runtime/services/plugin.service.d.cts.map +1 -1
  238. package/dist/runtime/services/plugin.service.d.mts +14 -36
  239. package/dist/runtime/services/plugin.service.d.mts.map +1 -1
  240. package/dist/runtime/services/plugin.service.mjs +14 -18
  241. package/dist/runtime/services/plugin.service.mjs.map +1 -1
  242. package/dist/runtime/services/secrets.service.cjs +12 -12
  243. package/dist/runtime/services/secrets.service.cjs.map +1 -1
  244. package/dist/runtime/services/secrets.service.d.cts +3 -15
  245. package/dist/runtime/services/secrets.service.d.mts +3 -15
  246. package/dist/runtime/services/secrets.service.mjs +12 -13
  247. package/dist/runtime/services/secrets.service.mjs.map +1 -1
  248. package/dist/runtime/services/shared-identity.cjs +40 -0
  249. package/dist/runtime/services/shared-identity.cjs.map +1 -0
  250. package/dist/runtime/services/shared-identity.mjs +38 -0
  251. package/dist/runtime/services/shared-identity.mjs.map +1 -0
  252. package/dist/runtime/validation.cjs +2 -2
  253. package/dist/runtime/validation.cjs.map +1 -1
  254. package/dist/runtime/validation.mjs +2 -2
  255. package/dist/runtime/validation.mjs.map +1 -1
  256. package/dist/shared-deps-spec.cjs +384 -0
  257. package/dist/shared-deps-spec.cjs.map +1 -0
  258. package/dist/shared-deps-spec.d.cts +182 -0
  259. package/dist/shared-deps-spec.d.cts.map +1 -0
  260. package/dist/shared-deps-spec.d.mts +182 -0
  261. package/dist/shared-deps-spec.d.mts.map +1 -0
  262. package/dist/shared-deps-spec.mjs +368 -0
  263. package/dist/shared-deps-spec.mjs.map +1 -0
  264. package/dist/types.d.cts +22 -41
  265. package/dist/types.d.cts.map +1 -1
  266. package/dist/types.d.mts +22 -41
  267. package/dist/types.d.mts.map +1 -1
  268. package/dist/ui/manifest/construct.cjs +268 -0
  269. package/dist/ui/manifest/construct.cjs.map +1 -0
  270. package/dist/ui/manifest/construct.d.cts +48 -0
  271. package/dist/ui/manifest/construct.d.cts.map +1 -0
  272. package/dist/ui/manifest/construct.d.mts +48 -0
  273. package/dist/ui/manifest/construct.d.mts.map +1 -0
  274. package/dist/ui/manifest/construct.mjs +268 -0
  275. package/dist/ui/manifest/construct.mjs.map +1 -0
  276. package/dist/ui/manifest/contract.cjs +34 -0
  277. package/dist/ui/manifest/contract.cjs.map +1 -0
  278. package/dist/ui/manifest/contract.d.cts +26 -0
  279. package/dist/ui/manifest/contract.d.cts.map +1 -0
  280. package/dist/ui/manifest/contract.d.mts +26 -0
  281. package/dist/ui/manifest/contract.d.mts.map +1 -0
  282. package/dist/ui/manifest/contract.mjs +26 -0
  283. package/dist/ui/manifest/contract.mjs.map +1 -0
  284. package/dist/ui/manifest/descriptor.cjs +64 -0
  285. package/dist/ui/manifest/descriptor.cjs.map +1 -0
  286. package/dist/ui/manifest/descriptor.d.cts +60 -0
  287. package/dist/ui/manifest/descriptor.d.cts.map +1 -0
  288. package/dist/ui/manifest/descriptor.d.mts +60 -0
  289. package/dist/ui/manifest/descriptor.d.mts.map +1 -0
  290. package/dist/ui/manifest/descriptor.mjs +61 -0
  291. package/dist/ui/manifest/descriptor.mjs.map +1 -0
  292. package/dist/ui/manifest/generator.cjs +128 -0
  293. package/dist/ui/manifest/generator.cjs.map +1 -0
  294. package/dist/ui/manifest/generator.d.cts +41 -0
  295. package/dist/ui/manifest/generator.d.cts.map +1 -0
  296. package/dist/ui/manifest/generator.d.mts +41 -0
  297. package/dist/ui/manifest/generator.d.mts.map +1 -0
  298. package/dist/ui/manifest/generator.mjs +125 -0
  299. package/dist/ui/manifest/generator.mjs.map +1 -0
  300. package/dist/ui/manifest/index.cjs +35 -0
  301. package/dist/ui/manifest/index.d.cts +9 -0
  302. package/dist/ui/manifest/index.d.mts +9 -0
  303. package/dist/ui/manifest/index.mjs +9 -0
  304. package/dist/ui/manifest/manifest-schema.cjs +97 -0
  305. package/dist/ui/manifest/manifest-schema.cjs.map +1 -0
  306. package/dist/ui/manifest/manifest-schema.d.cts +132 -0
  307. package/dist/ui/manifest/manifest-schema.d.cts.map +1 -0
  308. package/dist/ui/manifest/manifest-schema.d.mts +132 -0
  309. package/dist/ui/manifest/manifest-schema.d.mts.map +1 -0
  310. package/dist/ui/manifest/manifest-schema.mjs +90 -0
  311. package/dist/ui/manifest/manifest-schema.mjs.map +1 -0
  312. package/dist/ui/manifest/mount-registry.cjs +52 -0
  313. package/dist/ui/manifest/mount-registry.cjs.map +1 -0
  314. package/dist/ui/manifest/mount-registry.d.cts +61 -0
  315. package/dist/ui/manifest/mount-registry.d.cts.map +1 -0
  316. package/dist/ui/manifest/mount-registry.d.mts +61 -0
  317. package/dist/ui/manifest/mount-registry.d.mts.map +1 -0
  318. package/dist/ui/manifest/mount-registry.mjs +48 -0
  319. package/dist/ui/manifest/mount-registry.mjs.map +1 -0
  320. package/dist/ui/manifest/nav.cjs +13 -0
  321. package/dist/ui/manifest/nav.cjs.map +1 -0
  322. package/dist/ui/manifest/nav.d.cts +34 -0
  323. package/dist/ui/manifest/nav.d.cts.map +1 -0
  324. package/dist/ui/manifest/nav.d.mts +34 -0
  325. package/dist/ui/manifest/nav.d.mts.map +1 -0
  326. package/dist/ui/manifest/nav.mjs +13 -0
  327. package/dist/ui/manifest/nav.mjs.map +1 -0
  328. package/dist/ui/manifest/route-config.cjs +33 -0
  329. package/dist/ui/manifest/route-config.cjs.map +1 -0
  330. package/dist/ui/manifest/route-config.d.cts +40 -0
  331. package/dist/ui/manifest/route-config.d.cts.map +1 -0
  332. package/dist/ui/manifest/route-config.d.mts +40 -0
  333. package/dist/ui/manifest/route-config.d.mts.map +1 -0
  334. package/dist/ui/manifest/route-config.mjs +33 -0
  335. package/dist/ui/manifest/route-config.mjs.map +1 -0
  336. package/dist/version-manifest.cjs +65 -0
  337. package/dist/version-manifest.cjs.map +1 -0
  338. package/dist/version-manifest.d.cts +52 -0
  339. package/dist/version-manifest.d.cts.map +1 -0
  340. package/dist/version-manifest.d.mts +52 -0
  341. package/dist/version-manifest.d.mts.map +1 -0
  342. package/dist/version-manifest.mjs +63 -0
  343. package/dist/version-manifest.mjs.map +1 -0
  344. package/package.json +165 -68
  345. package/skills/plugin-client/SKILL.md +24 -5
  346. package/skills/plugin-development/SKILL.md +79 -47
  347. package/skills/plugin-testing/SKILL.md +41 -12
  348. package/src/build/artifact-names.ts +117 -0
  349. package/src/build/contract-types.ts +101 -0
  350. package/src/build/rspack/build-report-plugin.ts +34 -0
  351. package/src/build/rspack/chunk-completeness-plugin.ts +57 -0
  352. package/src/build/rspack/compose.ts +87 -0
  353. package/src/build/rspack/fix-mf-data-uri-plugin.ts +23 -12
  354. package/src/build/rspack/generated-config.ts +35 -0
  355. package/src/build/rspack/index.ts +10 -5
  356. package/src/build/rspack/module-federation.ts +1 -1
  357. package/src/build/rspack/plugin.ts +103 -105
  358. package/src/build/rspack/utils.ts +8 -2
  359. package/src/build/ui/factory.ts +96 -0
  360. package/src/build/ui/generated-config.ts +133 -0
  361. package/src/build/ui/hash-artifacts-plugin.ts +79 -0
  362. package/src/build/ui/index.ts +98 -0
  363. package/src/build/ui/manifest-plugin.ts +54 -0
  364. package/src/build/ui/rsbuild-config.ts +256 -0
  365. package/src/build/ui/stubs.ts +103 -0
  366. package/src/cli.ts +100 -0
  367. package/src/dev/serve.ts +477 -0
  368. package/src/dev/watch-kill.ts +58 -0
  369. package/src/effect-helpers.ts +25 -0
  370. package/src/errors.ts +16 -18
  371. package/src/identity.ts +36 -0
  372. package/src/index.ts +4 -0
  373. package/src/plugin.ts +70 -92
  374. package/src/remote-entry.ts +171 -0
  375. package/src/runtime/errors.ts +186 -27
  376. package/src/runtime/index.ts +132 -43
  377. package/src/runtime/mf-config.ts +12 -107
  378. package/src/runtime/services/module-federation.service.ts +221 -117
  379. package/src/runtime/services/normalize.ts +1 -18
  380. package/src/runtime/services/plugin-lifecycle.service.ts +66 -75
  381. package/src/runtime/services/plugin-loader.service.ts +239 -212
  382. package/src/runtime/services/plugin.service.ts +61 -43
  383. package/src/runtime/services/secrets.service.ts +20 -15
  384. package/src/runtime/services/shared-identity.ts +68 -0
  385. package/src/runtime/validation.ts +5 -7
  386. package/src/shared-deps-spec.ts +478 -0
  387. package/src/types.ts +22 -48
  388. package/src/ui/manifest/construct.ts +403 -0
  389. package/src/ui/manifest/contract.ts +33 -0
  390. package/src/ui/manifest/descriptor.ts +96 -0
  391. package/src/ui/manifest/generator.ts +238 -0
  392. package/src/ui/manifest/index.ts +55 -0
  393. package/src/ui/manifest/manifest-schema.ts +107 -0
  394. package/src/ui/manifest/mount-registry.ts +50 -0
  395. package/src/ui/manifest/nav.ts +43 -0
  396. package/src/ui/manifest/route-config.ts +82 -0
  397. package/src/version-manifest.ts +88 -0
  398. package/dist/build/rspack/dev-server-middleware.cjs +0 -248
  399. package/dist/build/rspack/dev-server-middleware.cjs.map +0 -1
  400. package/dist/build/rspack/dev-server-middleware.mjs +0 -247
  401. package/dist/build/rspack/dev-server-middleware.mjs.map +0 -1
  402. package/dist/build/shared-deps.cjs +0 -83
  403. package/dist/build/shared-deps.cjs.map +0 -1
  404. package/dist/build/shared-deps.d.cts +0 -67
  405. package/dist/build/shared-deps.d.cts.map +0 -1
  406. package/dist/build/shared-deps.d.mts +0 -67
  407. package/dist/build/shared-deps.d.mts.map +0 -1
  408. package/dist/build/shared-deps.mjs +0 -79
  409. package/dist/build/shared-deps.mjs.map +0 -1
  410. package/dist/effect.cjs +0 -9
  411. package/dist/effect.d.cts +0 -1
  412. package/dist/effect.d.mts +0 -1
  413. package/dist/effect.mjs +0 -3
  414. package/dist/orpc-openapi.cjs +0 -17
  415. package/dist/orpc-openapi.d.cts +0 -2
  416. package/dist/orpc-openapi.d.mts +0 -2
  417. package/dist/orpc-openapi.mjs +0 -5
  418. package/dist/orpc.cjs +0 -46
  419. package/dist/orpc.d.cts +0 -7
  420. package/dist/orpc.d.mts +0 -7
  421. package/dist/orpc.mjs +0 -11
  422. package/dist/package.cjs +0 -23
  423. package/dist/package.cjs.map +0 -1
  424. package/dist/package.mjs +0 -17
  425. package/dist/package.mjs.map +0 -1
  426. package/dist/runtime/services/module-federation.service.d.cts.map +0 -1
  427. package/dist/runtime/services/module-federation.service.d.mts.map +0 -1
  428. package/dist/runtime/services/normalize.cjs.map +0 -1
  429. package/dist/runtime/services/normalize.d.cts.map +0 -1
  430. package/dist/runtime/services/normalize.d.mts.map +0 -1
  431. package/dist/runtime/services/normalize.mjs.map +0 -1
  432. package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +0 -1
  433. package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +0 -1
  434. package/dist/runtime/services/plugin-loader.service.d.cts.map +0 -1
  435. package/dist/runtime/services/plugin-loader.service.d.mts.map +0 -1
  436. package/dist/runtime/services/secrets.service.d.cts.map +0 -1
  437. package/dist/runtime/services/secrets.service.d.mts.map +0 -1
  438. package/dist/testing/index.cjs +0 -57
  439. package/dist/testing/index.cjs.map +0 -1
  440. package/dist/testing/index.d.cts +0 -54
  441. package/dist/testing/index.d.cts.map +0 -1
  442. package/dist/testing/index.d.mts +0 -54
  443. package/dist/testing/index.d.mts.map +0 -1
  444. package/dist/testing/index.mjs +0 -55
  445. package/dist/testing/index.mjs.map +0 -1
  446. package/dist/zod-core.cjs +0 -9
  447. package/dist/zod-core.d.cts +0 -1
  448. package/dist/zod-core.d.mts +0 -1
  449. package/dist/zod-core.mjs +0 -3
  450. package/dist/zod.cjs +0 -11
  451. package/dist/zod.d.cts +0 -2
  452. package/dist/zod.d.mts +0 -2
  453. package/dist/zod.mjs +0 -3
  454. package/src/build/rspack/dev-server-middleware.ts +0 -324
  455. package/src/build/shared-deps.ts +0 -102
  456. package/src/effect.ts +0 -1
  457. package/src/orpc-openapi.ts +0 -2
  458. package/src/orpc.ts +0 -9
  459. package/src/testing/index.ts +0 -87
  460. package/src/testing/mocks/module-federation.service.ts +0 -41
  461. package/src/zod-core.ts +0 -1
  462. package/src/zod.ts +0 -3
@@ -1,86 +1,77 @@
1
- import { Effect, Exit, Ref, Scope } from "effect";
1
+ import { Config, Context, Effect, Exit, Layer, Ref, Scope } from "effect";
2
2
  import type { AnyPlugin, InitializedPlugin } from "../../types";
3
- import { toPluginRuntimeError } from "../errors";
3
+ import type { PluginRuntimeError } from "../errors";
4
4
 
5
- export class PluginLifecycleService extends Effect.Service<PluginLifecycleService>()(
6
- "PluginLifecycleService",
7
- {
8
- effect: Effect.gen(function* () {
9
- const activePlugins = yield* Ref.make(new Set<InitializedPlugin<AnyPlugin>>());
5
+ export interface PluginLifecycleServiceShape {
6
+ register: <T extends AnyPlugin>(plugin: InitializedPlugin<T>) => Effect.Effect<void>;
7
+ unregister: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void>;
8
+ shutdown: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void, PluginRuntimeError>;
9
+ cleanup: Effect.Effect<void>;
10
+ }
10
11
 
11
- return {
12
- register: <T extends AnyPlugin>(plugin: InitializedPlugin<T>) =>
13
- Ref.update(activePlugins, (plugins) =>
14
- new Set(plugins).add(plugin as InitializedPlugin<AnyPlugin>),
15
- ),
12
+ export class PluginLifecycleService extends Context.Service<
13
+ PluginLifecycleService,
14
+ PluginLifecycleServiceShape
15
+ >()("PluginLifecycleService") {}
16
16
 
17
- unregister: (plugin: InitializedPlugin<AnyPlugin>) =>
18
- Ref.update(activePlugins, (plugins) => {
17
+ export const PluginLifecycleServiceDefault = Layer.effect(
18
+ PluginLifecycleService,
19
+ Effect.gen(function* () {
20
+ const activePlugins = yield* Ref.make(new Set<InitializedPlugin<AnyPlugin>>());
21
+
22
+ return {
23
+ register: <T extends AnyPlugin>(plugin: InitializedPlugin<T>) =>
24
+ Ref.update(activePlugins, (plugins) =>
25
+ new Set(plugins).add(plugin as InitializedPlugin<AnyPlugin>),
26
+ ),
27
+
28
+ unregister: (plugin: InitializedPlugin<AnyPlugin>) =>
29
+ Ref.update(activePlugins, (plugins) => {
30
+ const newSet = new Set(plugins);
31
+ newSet.delete(plugin);
32
+ return newSet;
33
+ }),
34
+
35
+ shutdown: (plugin: InitializedPlugin<AnyPlugin>) =>
36
+ Effect.gen(function* () {
37
+ yield* Ref.update(activePlugins, (plugins) => {
19
38
  const newSet = new Set(plugins);
20
39
  newSet.delete(plugin);
21
40
  return newSet;
22
- }),
23
-
24
- shutdown: (plugin: InitializedPlugin<AnyPlugin>) =>
25
- Effect.gen(function* () {
26
- // Remove from active plugins
27
- yield* Ref.update(activePlugins, (plugins) => {
28
- const newSet = new Set(plugins);
29
- newSet.delete(plugin);
30
- return newSet;
31
- });
41
+ });
32
42
 
33
- // Shutdown the plugin
34
- yield* plugin.plugin
35
- .shutdown()
36
- .pipe(
37
- Effect.mapError((error) =>
38
- toPluginRuntimeError(
39
- error,
40
- plugin.plugin.id,
41
- undefined,
42
- "shutdown-plugin",
43
- false,
44
- ),
45
- ),
46
- );
47
- }),
43
+ yield* Scope.close(plugin.scope, Exit.succeed(undefined)).pipe(
44
+ Effect.catchCause((cause) =>
45
+ Effect.logWarning(`Failed to close scope for plugin ${plugin.plugin.id}`, cause),
46
+ ),
47
+ );
48
+ }),
48
49
 
49
- cleanup: () =>
50
- Effect.gen(function* () {
51
- const plugins = yield* Ref.get(activePlugins);
52
- if (typeof process !== "undefined" && process.env?.EVERY_PLUGIN_DEBUG_SCOPES === "1") {
53
- yield* Effect.logWarning(
54
- `[PluginLifecycle] cleaning up ${plugins.size} active plugin(s)`,
55
- );
56
- }
50
+ cleanup: Effect.gen(function* () {
51
+ const plugins = yield* Ref.get(activePlugins);
52
+ const debugScopes = yield* Config.String("EVERY_PLUGIN_DEBUG_SCOPES").pipe(
53
+ Config.withDefault(""),
54
+ Effect.orElseSucceed(() => ""),
55
+ );
56
+ if (debugScopes === "1") {
57
+ yield* Effect.logWarning(
58
+ `[PluginLifecycle] cleaning up ${plugins.size} active plugin(s)`,
59
+ );
60
+ }
57
61
 
58
- yield* Effect.forEach(
59
- plugins,
60
- (plugin) =>
61
- Effect.gen(function* () {
62
- yield* plugin.plugin
63
- .shutdown()
64
- .pipe(
65
- Effect.catchAll((error) =>
66
- Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, error),
67
- ),
68
- );
69
- yield* Scope.close(plugin.scope, Exit.succeed(undefined)).pipe(
70
- Effect.catchAll((error) =>
71
- Effect.logWarning(
72
- `Failed to close scope for plugin ${plugin.plugin.id}`,
73
- error,
74
- ),
75
- ),
76
- );
77
- }),
78
- { concurrency: "unbounded" },
79
- );
62
+ yield* Effect.forEach(
63
+ plugins,
64
+ (plugin) =>
65
+ Scope.close(plugin.scope, Exit.succeed(undefined)).pipe(
66
+ Effect.catchCause((cause) =>
67
+ Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, cause),
68
+ ),
69
+ ),
70
+ { concurrency: "unbounded" },
71
+ );
80
72
 
81
- yield* Ref.set(activePlugins, new Set());
82
- }).pipe(Effect.catchAll((error) => Effect.logWarning("Plugin cleanup failed", error))),
83
- };
84
- }),
85
- },
86
- ) {}
73
+ yield* Ref.set(activePlugins, new Set());
74
+ }).pipe(Effect.catchCause((cause) => Effect.logWarning("Plugin cleanup failed", cause))),
75
+ };
76
+ }),
77
+ );
@@ -1,7 +1,7 @@
1
1
  import type { InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
2
- import { Context, Effect, Context as EffectContext, Exit, Layer, Scope } from "effect";
2
+ import { Context, Effect, Exit, Layer, Scope } from "effect";
3
3
  import type { z } from "zod";
4
- import { PluginIdTag, type PluginServicesTools } from "../../plugin";
4
+ import { PluginIdTag } from "../../plugin";
5
5
  import type {
6
6
  AnyPlugin,
7
7
  AnyPluginConstructor,
@@ -16,18 +16,32 @@ import { validate } from "../validation";
16
16
  import { ModuleFederationService } from "./module-federation.service";
17
17
  import { SecretsService } from "./secrets.service";
18
18
 
19
- export class PluginRegistryTag extends Context.Tag("PluginRegistry")<
20
- PluginRegistryTag,
21
- PluginRegistry
22
- >() {}
19
+ export class PluginRegistryTag extends Context.Service<PluginRegistryTag, PluginRegistry>()(
20
+ "PluginRegistry",
21
+ ) {}
23
22
 
24
- export class PluginMapTag extends Context.Tag("PluginMap")<
23
+ export class PluginMapTag extends Context.Service<
25
24
  PluginMapTag,
26
25
  Record<string, AnyPluginConstructor>
27
- >() {}
26
+ >()("PluginMap") {}
27
+
28
+ export interface RegistryServiceShape {
29
+ get: (
30
+ pluginId: string,
31
+ ) => Effect.Effect<
32
+ { constructor: (new () => AnyPlugin) | null; metadata: PluginMetadata },
33
+ PluginRuntimeError
34
+ >;
35
+ getModule: (pluginId: string) => Effect.Effect<AnyPluginConstructor | null>;
36
+ }
37
+
38
+ export class RegistryService extends Context.Service<RegistryService, RegistryServiceShape>()(
39
+ "RegistryService",
40
+ ) {}
28
41
 
29
- export class RegistryService extends Effect.Service<RegistryService>()("RegistryService", {
30
- effect: Effect.gen(function* () {
42
+ export const RegistryServiceDefault = Layer.effect(
43
+ RegistryService,
44
+ Effect.gen(function* () {
31
45
  const registry = yield* PluginRegistryTag;
32
46
  const pluginMap = yield* PluginMapTag;
33
47
 
@@ -37,14 +51,11 @@ export class RegistryService extends Effect.Service<RegistryService>()("Registry
37
51
  const entry = registry[pluginId];
38
52
 
39
53
  if (!entry) {
40
- return yield* Effect.fail(
41
- new PluginRuntimeError({
42
- pluginId,
43
- operation: "validate-plugin-id",
44
- cause: new Error(`Plugin ${pluginId} not found in registry`),
45
- retryable: false,
46
- }),
47
- );
54
+ return yield* new PluginRuntimeError({
55
+ pluginId,
56
+ operation: "validate-plugin-id",
57
+ cause: new Error(`Plugin ${pluginId} not found in registry`),
58
+ });
48
59
  }
49
60
 
50
61
  if ("module" in entry) {
@@ -71,223 +82,239 @@ export class RegistryService extends Effect.Service<RegistryService>()("Registry
71
82
  getModule: (pluginId: string) => Effect.succeed(pluginMap[pluginId] || null),
72
83
  };
73
84
  }),
74
- }) {}
75
-
76
- export class PluginLoaderService extends Effect.Service<PluginLoaderService>()(
77
- "PluginLoaderService",
78
- {
79
- effect: Effect.gen(function* () {
80
- const moduleFederationService = yield* ModuleFederationService;
81
- const secretsService = yield* SecretsService;
82
- const registryService = yield* RegistryService;
83
-
84
- const resolveUrl = (baseUrl: string, version?: string): string =>
85
- version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
86
-
87
- return {
88
- loadPlugin: (pluginId: string) =>
89
- Effect.gen(function* () {
90
- const entry = yield* registryService.get(pluginId);
91
-
92
- if (entry.constructor) {
93
- yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
94
-
95
- return {
96
- ctor: entry.constructor,
97
- metadata: entry.metadata,
98
- } satisfies LoadedPlugin;
99
- }
100
-
101
- const url = entry.metadata.remoteUrl;
102
- if (!url) {
103
- return yield* Effect.fail(
104
- new PluginRuntimeError({
105
- pluginId,
106
- operation: "load-plugin",
107
- cause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),
108
- retryable: false,
109
- }),
110
- );
111
- }
112
-
113
- const resolvedUrl = resolveUrl(url);
85
+ );
86
+
87
+ export interface PluginLoaderServiceShape {
88
+ loadPlugin: (pluginId: string) => Effect.Effect<LoadedPlugin, PluginRuntimeError>;
89
+ instantiatePlugin: <T extends AnyPlugin>(
90
+ pluginId: string,
91
+ loadedPlugin: LoadedPlugin<T>,
92
+ ) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
93
+ initializePlugin: <T extends AnyPlugin>(
94
+ pluginInstance: PluginInstance<T>,
95
+ config: {
96
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
97
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
98
+ },
99
+ plugins?: Record<string, unknown>,
100
+ ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
101
+ }
102
+
103
+ export class PluginLoaderService extends Context.Service<
104
+ PluginLoaderService,
105
+ PluginLoaderServiceShape
106
+ >()("PluginLoaderService") {}
107
+
108
+ export const PluginLoaderServiceDefault = Layer.effect(
109
+ PluginLoaderService,
110
+ Effect.gen(function* () {
111
+ const moduleFederationService = yield* ModuleFederationService;
112
+ const secretsService = yield* SecretsService;
113
+ const registryService = yield* RegistryService;
114
+
115
+ const resolveUrl = (baseUrl: string, version?: string): string =>
116
+ version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
114
117
 
115
- yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(
116
- Effect.tapError((error) =>
117
- Effect.logError(`Plugin ${pluginId} failed during register-remote: ${error}`),
118
- ),
119
- Effect.mapError((error) =>
120
- toPluginRuntimeError(error, pluginId, undefined, "register-remote", true),
121
- ),
122
- );
123
-
124
- yield* Effect.logDebug("Loading plugin from remote", { pluginId, url: resolvedUrl });
118
+ return {
119
+ loadPlugin: (pluginId: string) =>
120
+ Effect.gen(function* () {
121
+ const entry = yield* registryService.get(pluginId);
125
122
 
126
- const ctor = yield* moduleFederationService
127
- .loadRemoteConstructor(pluginId, resolvedUrl)
128
- .pipe(
129
- Effect.tapError((error) =>
130
- Effect.logError(`Plugin ${pluginId} failed during load-remote: ${error}`),
131
- ),
132
- Effect.mapError((error) =>
133
- toPluginRuntimeError(error, pluginId, undefined, "load-remote", false),
134
- ),
135
- );
123
+ if (entry.constructor) {
124
+ yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
136
125
 
137
126
  return {
138
- ctor,
127
+ ctor: entry.constructor,
139
128
  metadata: entry.metadata,
140
129
  } satisfies LoadedPlugin;
141
- }),
130
+ }
142
131
 
143
- instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) =>
144
- Effect.gen(function* () {
145
- const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(
146
- Effect.tapError((error) =>
147
- Effect.logError(`Plugin ${pluginId} failed during instantiate-plugin: ${error}`),
148
- ),
149
- Effect.mapError((error) =>
150
- toPluginRuntimeError(error, pluginId, undefined, "instantiate-plugin", false),
151
- ),
152
- );
132
+ const url = entry.metadata.remoteUrl;
133
+ if (!url) {
134
+ return yield* new PluginRuntimeError({
135
+ pluginId,
136
+ operation: "load-plugin",
137
+ cause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),
138
+ });
139
+ }
153
140
 
154
- (instance.id as string) = pluginId;
141
+ const resolvedUrl = resolveUrl(url);
155
142
 
156
- return {
157
- plugin: instance,
158
- metadata: loadedPlugin.metadata,
159
- } satisfies PluginInstance<T>;
160
- }),
161
-
162
- initializePlugin: <T extends AnyPlugin>(
163
- pluginInstance: PluginInstance<T>,
164
- config: {
165
- variables: InferSchemaInput<T["configSchema"]["variables"]>;
166
- secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
167
- },
168
- plugins?: Record<string, unknown>,
169
- ) =>
170
- Effect.gen(function* () {
171
- const { plugin } = pluginInstance;
172
-
173
- // Validate and hydrate config
174
- const validatedVariables = yield* validate(
175
- plugin.configSchema.variables as z.ZodSchema<
176
- InferSchemaOutput<T["configSchema"]["variables"]>
177
- >,
178
- config.variables,
179
- plugin.id,
180
- "config",
181
- ).pipe(
182
- Effect.mapError(
183
- (validationError) =>
184
- new PluginRuntimeError({
185
- pluginId: plugin.id,
186
- operation: "validate-config",
187
- cause: validationError.zodError,
188
- retryable: false,
189
- }),
190
- ),
191
- );
143
+ yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(
144
+ Effect.tapError((error) =>
145
+ Effect.logError(`Plugin ${pluginId} failed during register-remote: ${String(error)}`),
146
+ ),
147
+ Effect.mapError((error) =>
148
+ toPluginRuntimeError(error, pluginId, undefined, "register-remote"),
149
+ ),
150
+ );
192
151
 
193
- // Validate secrets
194
- const validatedSecrets = yield* validate(
195
- plugin.configSchema.secrets as z.ZodSchema<
196
- InferSchemaOutput<T["configSchema"]["secrets"]>
197
- >,
198
- config.secrets,
199
- plugin.id,
200
- "config",
201
- ).pipe(
202
- Effect.mapError(
203
- (validationError) =>
204
- new PluginRuntimeError({
205
- pluginId: plugin.id,
206
- operation: "validate-secrets",
207
- cause: validationError.zodError,
208
- retryable: false,
209
- }),
210
- ),
211
- );
152
+ yield* Effect.logDebug("Loading plugin from remote", { pluginId, url: resolvedUrl });
212
153
 
213
- // Hydrate secrets in variables
214
- const hydratedConfig = yield* secretsService.hydrateSecrets({
215
- variables: validatedVariables,
216
- secrets: validatedSecrets,
217
- });
218
-
219
- const _variables = yield* validate(
220
- plugin.configSchema.variables as z.ZodSchema<
221
- InferSchemaOutput<T["configSchema"]["variables"]>
222
- >,
223
- hydratedConfig.variables,
224
- plugin.id,
225
- "config",
226
- ).pipe(
227
- Effect.mapError(
228
- (validationError) =>
229
- new PluginRuntimeError({
230
- pluginId: plugin.id,
231
- operation: "validate-hydrated-config",
232
- cause: validationError.zodError,
233
- retryable: false,
234
- }),
154
+ const ctor = yield* moduleFederationService
155
+ .loadRemoteConstructor(pluginId, resolvedUrl)
156
+ .pipe(
157
+ Effect.tapError((error) =>
158
+ Effect.logError(`Plugin ${pluginId} failed during load-remote: ${String(error)}`),
159
+ ),
160
+ Effect.mapError((error) =>
161
+ toPluginRuntimeError(error, pluginId, undefined, "load-remote"),
235
162
  ),
236
163
  );
237
164
 
238
- // Create a long-lived scope for this plugin instance
239
- const scope = yield* Scope.make();
165
+ return {
166
+ ctor,
167
+ metadata: entry.metadata,
168
+ } satisfies LoadedPlugin;
169
+ }),
240
170
 
241
- // Create a per-plugin MemoMap so tool-built layers are memoized
242
- const memoMap = yield* Layer.makeMemoMap;
171
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) =>
172
+ Effect.gen(function* () {
173
+ const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(
174
+ Effect.tapError((error) =>
175
+ Effect.logError(`Plugin ${pluginId} failed during instantiate-plugin: ${error}`),
176
+ ),
177
+ Effect.mapError((error) =>
178
+ toPluginRuntimeError(error, pluginId, undefined, "instantiate-plugin"),
179
+ ),
180
+ );
243
181
 
244
- const tools: PluginServicesTools = {
245
- buildService: (tag: any, layer: any) =>
246
- (Layer.buildWithMemoMap(layer, memoMap, scope) as any).pipe(
247
- Effect.map((ctx: any) => EffectContext.get(ctx, tag)) as any,
248
- ),
249
- };
182
+ (instance.id as string) = pluginId;
250
183
 
251
- // Initialize plugin within the scope.
252
- // If initialize fails, close the scope immediately so scoped
253
- // resources (DB pools, caches) are released — otherwise every
254
- // failed initialization leaks until the process exits.
255
- const context = yield* plugin
256
- .initialize(
257
- { variables: _variables, secrets: hydratedConfig.secrets },
258
- plugins ?? {},
259
- tools,
260
- )
184
+ return {
185
+ plugin: instance,
186
+ metadata: loadedPlugin.metadata,
187
+ } satisfies PluginInstance<T>;
188
+ }),
189
+
190
+ initializePlugin: <T extends AnyPlugin>(
191
+ pluginInstance: PluginInstance<T>,
192
+ config: {
193
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
194
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
195
+ },
196
+ plugins?: Record<string, unknown>,
197
+ ) =>
198
+ Effect.gen(function* () {
199
+ const { plugin } = pluginInstance;
200
+
201
+ // Validate and hydrate config
202
+ const validatedVariables = yield* validate(
203
+ plugin.configSchema.variables as z.ZodSchema<
204
+ InferSchemaOutput<T["configSchema"]["variables"]>
205
+ >,
206
+ config.variables,
207
+ plugin.id,
208
+ "config",
209
+ ).pipe(
210
+ Effect.mapError(
211
+ (validationError) =>
212
+ new PluginRuntimeError({
213
+ pluginId: plugin.id,
214
+ operation: "validate-config",
215
+ cause: validationError.zodError,
216
+ }),
217
+ ),
218
+ );
219
+
220
+ // Validate secrets
221
+ const validatedSecrets = yield* validate(
222
+ plugin.configSchema.secrets as z.ZodSchema<
223
+ InferSchemaOutput<T["configSchema"]["secrets"]>
224
+ >,
225
+ config.secrets,
226
+ plugin.id,
227
+ "config",
228
+ ).pipe(
229
+ Effect.mapError(
230
+ (validationError) =>
231
+ new PluginRuntimeError({
232
+ pluginId: plugin.id,
233
+ operation: "validate-secrets",
234
+ cause: validationError.zodError,
235
+ }),
236
+ ),
237
+ );
238
+
239
+ // Hydrate secrets in variables
240
+ const hydratedConfig = yield* secretsService.hydrateSecrets({
241
+ variables: validatedVariables,
242
+ secrets: validatedSecrets,
243
+ });
244
+
245
+ const _variables = yield* validate(
246
+ plugin.configSchema.variables as z.ZodSchema<
247
+ InferSchemaOutput<T["configSchema"]["variables"]>
248
+ >,
249
+ hydratedConfig.variables,
250
+ plugin.id,
251
+ "config",
252
+ ).pipe(
253
+ Effect.mapError(
254
+ (validationError) =>
255
+ new PluginRuntimeError({
256
+ pluginId: plugin.id,
257
+ operation: "validate-hydrated-config",
258
+ cause: validationError.zodError,
259
+ }),
260
+ ),
261
+ );
262
+
263
+ // Create a long-lived scope for this plugin instance. Initialize
264
+ // returns a Layer which is built against this scope, so scoped
265
+ // resources (DB pools, caches) release on plugin shutdown.
266
+ const scope = yield* Scope.make();
267
+
268
+ // Build the plugin's Layer within the scope.
269
+ // On failure, close the scope immediately so scoped resources
270
+ // (DB pools, caches) are released — otherwise every failed
271
+ // initialization leaks until the process exits.
272
+ const effectContext = yield* Effect.gen(function* () {
273
+ const layer = yield* plugin
274
+ .initialize({ variables: _variables, secrets: hydratedConfig.secrets }, plugins ?? {})
261
275
  .pipe(
262
276
  Effect.provideService(PluginIdTag, plugin.id),
263
277
  Effect.provideService(Scope.Scope, scope),
264
- Effect.tapError(() =>
265
- Scope.close(scope, Exit.succeed(undefined)).pipe(
266
- Effect.catchAll((closeError) =>
278
+ );
279
+
280
+ return yield* Layer.buildWithScope(layer, scope).pipe(
281
+ Effect.provideService(PluginIdTag, plugin.id),
282
+ Effect.provideService(Scope.Scope, scope),
283
+ Effect.mapError((error) =>
284
+ toPluginRuntimeError(error, plugin.id, undefined, "initialize-layer"),
285
+ ),
286
+ );
287
+ }).pipe(
288
+ Effect.onExit((exit) =>
289
+ Exit.isSuccess(exit)
290
+ ? Effect.void
291
+ : Scope.close(scope, exit).pipe(
292
+ Effect.catchCause((closeCause) =>
267
293
  Effect.logWarning(
268
294
  `Failed to close scope for plugin ${plugin.id} after initialize error`,
269
- closeError,
295
+ closeCause,
270
296
  ),
271
297
  ),
272
298
  ),
273
- ),
274
- Effect.tapError((error) =>
275
- Effect.logError(`Plugin ${plugin.id} failed during initialize-plugin: ${error}`),
276
- ),
277
- Effect.mapError((error) =>
278
- toPluginRuntimeError(error, plugin.id, undefined, "initialize-plugin", false),
279
- ),
280
- );
299
+ ),
300
+ Effect.tapError((error) =>
301
+ Effect.logError(
302
+ `Plugin ${plugin.id} failed during initialize-plugin: ${String(error)}`,
303
+ ),
304
+ ),
305
+ Effect.mapError((error) =>
306
+ toPluginRuntimeError(error, plugin.id, undefined, "initialize-plugin"),
307
+ ),
308
+ );
281
309
 
282
- return {
283
- plugin,
284
- metadata: pluginInstance.metadata,
285
- config: { variables: _variables, secrets: hydratedConfig.secrets },
286
- context,
287
- scope,
288
- } satisfies InitializedPlugin<T>;
289
- }),
290
- };
291
- }),
292
- },
293
- ) {}
310
+ return {
311
+ plugin,
312
+ metadata: pluginInstance.metadata,
313
+ config: { variables: _variables, secrets: hydratedConfig.secrets },
314
+ effectContext,
315
+ scope,
316
+ } satisfies InitializedPlugin<T>;
317
+ }),
318
+ };
319
+ }),
320
+ );