everything-dev 1.53.2 → 2.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 (713) hide show
  1. package/README.md +2 -11
  2. package/dist/_virtual/_rolldown/runtime.cjs +17 -2
  3. package/dist/_virtual/_rolldown/runtime.mjs +36 -0
  4. package/dist/api/auth-middleware.cjs +161 -0
  5. package/dist/api/auth-middleware.cjs.map +1 -0
  6. package/dist/api/auth-middleware.d.cts +69 -0
  7. package/dist/api/auth-middleware.d.mts +69 -0
  8. package/dist/api/auth-middleware.mjs +160 -0
  9. package/dist/api/auth-middleware.mjs.map +1 -0
  10. package/dist/api-contract.cjs +250 -62
  11. package/dist/api-contract.cjs.map +1 -1
  12. package/dist/api-contract.mjs +246 -65
  13. package/dist/api-contract.mjs.map +1 -1
  14. package/dist/app.cjs +99 -26
  15. package/dist/app.cjs.map +1 -1
  16. package/dist/app.d.cts +3 -0
  17. package/dist/app.d.mts +3 -0
  18. package/dist/app.mjs +100 -27
  19. package/dist/app.mjs.map +1 -1
  20. package/dist/auth-login.cjs +163 -0
  21. package/dist/auth-login.cjs.map +1 -0
  22. package/dist/auth-login.mjs +162 -0
  23. package/dist/auth-login.mjs.map +1 -0
  24. package/dist/auth-session.cjs +64 -0
  25. package/dist/auth-session.cjs.map +1 -0
  26. package/dist/auth-session.mjs +58 -0
  27. package/dist/auth-session.mjs.map +1 -0
  28. package/dist/auth-types-gen.cjs +0 -1
  29. package/dist/auth-types-gen.cjs.map +1 -1
  30. package/dist/build.cjs +37 -173
  31. package/dist/build.cjs.map +1 -1
  32. package/dist/build.mjs +37 -171
  33. package/dist/build.mjs.map +1 -1
  34. package/dist/bundle-cache.cjs +74 -0
  35. package/dist/bundle-cache.cjs.map +1 -0
  36. package/dist/bundle-cache.d.cts +27 -0
  37. package/dist/bundle-cache.d.mts +27 -0
  38. package/dist/bundle-cache.mjs +68 -0
  39. package/dist/bundle-cache.mjs.map +1 -0
  40. package/dist/bundle-fs-resolve.cjs +209 -0
  41. package/dist/bundle-fs-resolve.cjs.map +1 -0
  42. package/dist/bundle-fs-resolve.d.cts +76 -0
  43. package/dist/bundle-fs-resolve.d.mts +76 -0
  44. package/dist/bundle-fs-resolve.mjs +202 -0
  45. package/dist/bundle-fs-resolve.mjs.map +1 -0
  46. package/dist/cdn-deploy.cjs +126 -0
  47. package/dist/cdn-deploy.cjs.map +1 -0
  48. package/dist/cdn-deploy.mjs +124 -0
  49. package/dist/cdn-deploy.mjs.map +1 -0
  50. package/dist/cli/db-doctor.cjs +19 -19
  51. package/dist/cli/db-doctor.cjs.map +1 -1
  52. package/dist/cli/db-doctor.mjs +18 -18
  53. package/dist/cli/db-doctor.mjs.map +1 -1
  54. package/dist/cli/db-repair.cjs +9 -32
  55. package/dist/cli/db-repair.cjs.map +1 -1
  56. package/dist/cli/db-repair.mjs +9 -32
  57. package/dist/cli/db-repair.mjs.map +1 -1
  58. package/dist/cli/framework-version.cjs +7 -3
  59. package/dist/cli/framework-version.cjs.map +1 -1
  60. package/dist/cli/framework-version.mjs +7 -3
  61. package/dist/cli/framework-version.mjs.map +1 -1
  62. package/dist/cli/infra.cjs +159 -251
  63. package/dist/cli/infra.cjs.map +1 -1
  64. package/dist/cli/infra.mjs +154 -242
  65. package/dist/cli/infra.mjs.map +1 -1
  66. package/dist/cli/init.cjs +624 -196
  67. package/dist/cli/init.cjs.map +1 -1
  68. package/dist/cli/init.d.cts +61 -8
  69. package/dist/cli/init.d.mts +61 -8
  70. package/dist/cli/init.mjs +613 -194
  71. package/dist/cli/init.mjs.map +1 -1
  72. package/dist/cli/parse.cjs +8 -7
  73. package/dist/cli/parse.cjs.map +1 -1
  74. package/dist/cli/parse.mjs +9 -7
  75. package/dist/cli/parse.mjs.map +1 -1
  76. package/dist/cli/prompts.cjs +14 -1
  77. package/dist/cli/prompts.cjs.map +1 -1
  78. package/dist/cli/prompts.mjs +14 -1
  79. package/dist/cli/prompts.mjs.map +1 -1
  80. package/dist/cli/prune.cjs +220 -0
  81. package/dist/cli/prune.cjs.map +1 -0
  82. package/dist/cli/prune.mjs +220 -0
  83. package/dist/cli/prune.mjs.map +1 -0
  84. package/dist/cli/snapshot.cjs +2 -1
  85. package/dist/cli/snapshot.cjs.map +1 -1
  86. package/dist/cli/snapshot.mjs +2 -1
  87. package/dist/cli/snapshot.mjs.map +1 -1
  88. package/dist/cli/status.cjs +5 -4
  89. package/dist/cli/status.cjs.map +1 -1
  90. package/dist/cli/status.mjs +6 -5
  91. package/dist/cli/status.mjs.map +1 -1
  92. package/dist/cli/sync.cjs +156 -58
  93. package/dist/cli/sync.cjs.map +1 -1
  94. package/dist/cli/sync.mjs +158 -63
  95. package/dist/cli/sync.mjs.map +1 -1
  96. package/dist/cli/timing.cjs +0 -1
  97. package/dist/cli/timing.cjs.map +1 -1
  98. package/dist/cli/upgrade.cjs +95 -69
  99. package/dist/cli/upgrade.cjs.map +1 -1
  100. package/dist/cli/upgrade.mjs +97 -72
  101. package/dist/cli/upgrade.mjs.map +1 -1
  102. package/dist/cli/utils/helpers.cjs.map +1 -1
  103. package/dist/cli.cjs +320 -72
  104. package/dist/cli.cjs.map +1 -1
  105. package/dist/cli.mjs +316 -68
  106. package/dist/cli.mjs.map +1 -1
  107. package/dist/code-artifacts.cjs +76 -8
  108. package/dist/code-artifacts.cjs.map +1 -1
  109. package/dist/code-artifacts.mjs +76 -10
  110. package/dist/code-artifacts.mjs.map +1 -1
  111. package/dist/commands/build.cjs +65 -0
  112. package/dist/commands/build.cjs.map +1 -0
  113. package/dist/commands/build.mjs +65 -0
  114. package/dist/commands/build.mjs.map +1 -0
  115. package/dist/commands/config.cjs +77 -0
  116. package/dist/commands/config.cjs.map +1 -0
  117. package/dist/commands/config.d.cts +8 -0
  118. package/dist/commands/config.d.mts +8 -0
  119. package/dist/commands/config.mjs +74 -0
  120. package/dist/commands/config.mjs.map +1 -0
  121. package/dist/commands/db.cjs +107 -0
  122. package/dist/commands/db.cjs.map +1 -0
  123. package/dist/commands/db.mjs +107 -0
  124. package/dist/commands/db.mjs.map +1 -0
  125. package/dist/commands/deploy.cjs +336 -0
  126. package/dist/commands/deploy.cjs.map +1 -0
  127. package/dist/commands/deploy.mjs +334 -0
  128. package/dist/commands/deploy.mjs.map +1 -0
  129. package/dist/commands/dev.cjs +75 -0
  130. package/dist/commands/dev.cjs.map +1 -0
  131. package/dist/commands/dev.mjs +73 -0
  132. package/dist/commands/dev.mjs.map +1 -0
  133. package/dist/commands/init.cjs +234 -0
  134. package/dist/commands/init.cjs.map +1 -0
  135. package/dist/commands/init.mjs +231 -0
  136. package/dist/commands/init.mjs.map +1 -0
  137. package/dist/commands/keys.cjs +255 -0
  138. package/dist/commands/keys.cjs.map +1 -0
  139. package/dist/commands/keys.mjs +253 -0
  140. package/dist/commands/keys.mjs.map +1 -0
  141. package/dist/commands/ops.cjs +199 -0
  142. package/dist/commands/ops.cjs.map +1 -0
  143. package/dist/commands/ops.mjs +197 -0
  144. package/dist/commands/ops.mjs.map +1 -0
  145. package/dist/commands/plugins.cjs +211 -0
  146. package/dist/commands/plugins.cjs.map +1 -0
  147. package/dist/commands/plugins.mjs +211 -0
  148. package/dist/commands/plugins.mjs.map +1 -0
  149. package/dist/commands/shared.cjs +8 -0
  150. package/dist/commands/shared.cjs.map +1 -0
  151. package/dist/commands/shared.d.cts +6 -0
  152. package/dist/commands/shared.d.mts +6 -0
  153. package/dist/commands/shared.mjs +8 -0
  154. package/dist/commands/shared.mjs.map +1 -0
  155. package/dist/commands/upgrade.cjs +325 -0
  156. package/dist/commands/upgrade.cjs.map +1 -0
  157. package/dist/commands/upgrade.mjs +323 -0
  158. package/dist/commands/upgrade.mjs.map +1 -0
  159. package/dist/components/dev-render.cjs +340 -0
  160. package/dist/components/dev-render.cjs.map +1 -0
  161. package/dist/components/dev-render.mjs +332 -0
  162. package/dist/components/dev-render.mjs.map +1 -0
  163. package/dist/config.cjs +460 -221
  164. package/dist/config.cjs.map +1 -1
  165. package/dist/config.d.cts +491 -48
  166. package/dist/config.d.mts +491 -48
  167. package/dist/config.mjs +439 -212
  168. package/dist/config.mjs.map +1 -1
  169. package/dist/contract.cjs +327 -50
  170. package/dist/contract.cjs.map +1 -1
  171. package/dist/contract.d.cts +1951 -1062
  172. package/dist/contract.d.mts +1951 -1062
  173. package/dist/contract.meta.cjs +107 -12
  174. package/dist/contract.meta.cjs.map +1 -1
  175. package/dist/contract.meta.d.cts +166 -8
  176. package/dist/contract.meta.d.mts +166 -8
  177. package/dist/contract.meta.mjs +107 -11
  178. package/dist/contract.meta.mjs.map +1 -1
  179. package/dist/contract.mjs +580 -327
  180. package/dist/contract.mjs.map +1 -1
  181. package/dist/dag.cjs +5 -3
  182. package/dist/dag.cjs.map +1 -1
  183. package/dist/dag.mjs +6 -3
  184. package/dist/dag.mjs.map +1 -1
  185. package/dist/db/binding.cjs +80 -0
  186. package/dist/db/binding.cjs.map +1 -0
  187. package/dist/db/binding.d.cts +39 -0
  188. package/dist/db/binding.d.mts +39 -0
  189. package/dist/db/binding.mjs +78 -0
  190. package/dist/db/binding.mjs.map +1 -0
  191. package/dist/db/bindings.cjs +78 -0
  192. package/dist/db/bindings.cjs.map +1 -0
  193. package/dist/db/bindings.d.cts +34 -0
  194. package/dist/db/bindings.d.mts +34 -0
  195. package/dist/db/bindings.mjs +76 -0
  196. package/dist/db/bindings.mjs.map +1 -0
  197. package/dist/db/core.cjs +204 -0
  198. package/dist/db/core.cjs.map +1 -0
  199. package/dist/db/core.d.cts +69 -0
  200. package/dist/db/core.d.mts +69 -0
  201. package/dist/db/core.mjs +192 -0
  202. package/dist/db/core.mjs.map +1 -0
  203. package/dist/db/driver.cjs +167 -0
  204. package/dist/db/driver.cjs.map +1 -0
  205. package/dist/db/driver.d.cts +50 -0
  206. package/dist/db/driver.d.mts +50 -0
  207. package/dist/db/driver.mjs +165 -0
  208. package/dist/db/driver.mjs.map +1 -0
  209. package/dist/db/drizzle-kit.cjs +177 -0
  210. package/dist/db/drizzle-kit.cjs.map +1 -0
  211. package/dist/db/drizzle-kit.d.cts +25 -0
  212. package/dist/db/drizzle-kit.d.mts +25 -0
  213. package/dist/db/drizzle-kit.mjs +175 -0
  214. package/dist/db/drizzle-kit.mjs.map +1 -0
  215. package/dist/db/errors.cjs +27 -0
  216. package/dist/db/errors.cjs.map +1 -0
  217. package/dist/db/errors.d.cts +16 -0
  218. package/dist/db/errors.d.mts +16 -0
  219. package/dist/db/errors.mjs +26 -0
  220. package/dist/db/errors.mjs.map +1 -0
  221. package/dist/db/identity.cjs +55 -0
  222. package/dist/db/identity.cjs.map +1 -0
  223. package/dist/db/identity.d.cts +40 -0
  224. package/dist/db/identity.d.mts +40 -0
  225. package/dist/db/identity.mjs +53 -0
  226. package/dist/db/identity.mjs.map +1 -0
  227. package/dist/db/index.cjs +43 -0
  228. package/dist/db/index.d.cts +9 -0
  229. package/dist/db/index.d.mts +9 -0
  230. package/dist/db/index.mjs +10 -0
  231. package/dist/db/run-migrations.cjs +343 -0
  232. package/dist/db/run-migrations.cjs.map +1 -0
  233. package/dist/db/run-migrations.d.cts +87 -0
  234. package/dist/db/run-migrations.d.mts +87 -0
  235. package/dist/db/run-migrations.mjs +341 -0
  236. package/dist/db/run-migrations.mjs.map +1 -0
  237. package/dist/delegate-signer.cjs +85 -0
  238. package/dist/delegate-signer.cjs.map +1 -0
  239. package/dist/delegate-signer.mjs +84 -0
  240. package/dist/delegate-signer.mjs.map +1 -0
  241. package/dist/deploy-diff.cjs +119 -0
  242. package/dist/deploy-diff.cjs.map +1 -0
  243. package/dist/deploy-diff.mjs +109 -0
  244. package/dist/deploy-diff.mjs.map +1 -0
  245. package/dist/descriptor/constructors.cjs +49 -0
  246. package/dist/descriptor/constructors.cjs.map +1 -0
  247. package/dist/descriptor/constructors.d.cts +27 -0
  248. package/dist/descriptor/constructors.d.mts +27 -0
  249. package/dist/descriptor/constructors.mjs +45 -0
  250. package/dist/descriptor/constructors.mjs.map +1 -0
  251. package/dist/descriptor/index.cjs +24 -0
  252. package/dist/descriptor/index.d.cts +5 -0
  253. package/dist/descriptor/index.d.mts +5 -0
  254. package/dist/descriptor/index.mjs +6 -0
  255. package/dist/descriptor/resolve.cjs +258 -0
  256. package/dist/descriptor/resolve.cjs.map +1 -0
  257. package/dist/descriptor/resolve.d.cts +50 -0
  258. package/dist/descriptor/resolve.d.mts +50 -0
  259. package/dist/descriptor/resolve.mjs +252 -0
  260. package/dist/descriptor/resolve.mjs.map +1 -0
  261. package/dist/descriptor/schema.cjs +109 -0
  262. package/dist/descriptor/schema.cjs.map +1 -0
  263. package/dist/descriptor/schema.d.cts +217 -0
  264. package/dist/descriptor/schema.d.mts +217 -0
  265. package/dist/descriptor/schema.mjs +102 -0
  266. package/dist/descriptor/schema.mjs.map +1 -0
  267. package/dist/descriptor/serialize.cjs +45 -0
  268. package/dist/descriptor/serialize.cjs.map +1 -0
  269. package/dist/descriptor/serialize.d.cts +7 -0
  270. package/dist/descriptor/serialize.d.mts +7 -0
  271. package/dist/descriptor/serialize.mjs +45 -0
  272. package/dist/descriptor/serialize.mjs.map +1 -0
  273. package/dist/dev-log-pipeline.cjs +273 -0
  274. package/dist/dev-log-pipeline.cjs.map +1 -0
  275. package/dist/dev-log-pipeline.mjs +267 -0
  276. package/dist/dev-log-pipeline.mjs.map +1 -0
  277. package/dist/dev-logs.cjs +39 -8
  278. package/dist/dev-logs.cjs.map +1 -1
  279. package/dist/dev-logs.mjs +37 -9
  280. package/dist/dev-logs.mjs.map +1 -1
  281. package/dist/dev-program.cjs +405 -0
  282. package/dist/dev-program.cjs.map +1 -0
  283. package/dist/dev-program.d.cts +10 -0
  284. package/dist/dev-program.d.mts +10 -0
  285. package/dist/dev-program.mjs +395 -0
  286. package/dist/dev-program.mjs.map +1 -0
  287. package/dist/dev-session-data.d.cts +27 -0
  288. package/dist/dev-session-data.d.mts +27 -0
  289. package/dist/dev-session.cjs +178 -105
  290. package/dist/dev-session.cjs.map +1 -1
  291. package/dist/dev-session.mjs +180 -105
  292. package/dist/dev-session.mjs.map +1 -1
  293. package/dist/env/process-env.cjs +16 -0
  294. package/dist/env/process-env.cjs.map +1 -0
  295. package/dist/env/process-env.mjs +13 -0
  296. package/dist/env/process-env.mjs.map +1 -0
  297. package/dist/env/project-env.cjs +144 -0
  298. package/dist/env/project-env.cjs.map +1 -0
  299. package/dist/env/project-env.d.cts +1 -0
  300. package/dist/env/project-env.d.mts +1 -0
  301. package/dist/env/project-env.mjs +132 -0
  302. package/dist/env/project-env.mjs.map +1 -0
  303. package/dist/fastkv.cjs +59 -12
  304. package/dist/fastkv.cjs.map +1 -1
  305. package/dist/fastkv.d.cts +42 -6
  306. package/dist/fastkv.d.mts +42 -6
  307. package/dist/fastkv.mjs +58 -13
  308. package/dist/fastkv.mjs.map +1 -1
  309. package/dist/fingerprint.cjs +57 -0
  310. package/dist/fingerprint.cjs.map +1 -0
  311. package/dist/fingerprint.d.cts +14 -0
  312. package/dist/fingerprint.d.mts +14 -0
  313. package/dist/fingerprint.mjs +55 -0
  314. package/dist/fingerprint.mjs.map +1 -0
  315. package/dist/http-client.cjs +17 -17
  316. package/dist/http-client.cjs.map +1 -1
  317. package/dist/http-client.mjs +17 -17
  318. package/dist/http-client.mjs.map +1 -1
  319. package/dist/image-deploy.cjs +186 -0
  320. package/dist/image-deploy.cjs.map +1 -0
  321. package/dist/image-deploy.mjs +182 -0
  322. package/dist/image-deploy.mjs.map +1 -0
  323. package/dist/index.cjs +66 -18
  324. package/dist/index.d.cts +8 -7
  325. package/dist/index.d.mts +8 -7
  326. package/dist/index.mjs +6 -5
  327. package/dist/infra/docker.cjs +77 -0
  328. package/dist/infra/docker.cjs.map +1 -0
  329. package/dist/infra/docker.d.cts +10 -0
  330. package/dist/infra/docker.d.mts +10 -0
  331. package/dist/infra/docker.mjs +69 -0
  332. package/dist/infra/docker.mjs.map +1 -0
  333. package/dist/infra/materializer.cjs +74 -0
  334. package/dist/infra/materializer.cjs.map +1 -0
  335. package/dist/infra/materializer.mjs +70 -0
  336. package/dist/infra/materializer.mjs.map +1 -0
  337. package/dist/infra/planner.cjs +135 -103
  338. package/dist/infra/planner.cjs.map +1 -1
  339. package/dist/infra/planner.mjs +137 -104
  340. package/dist/infra/planner.mjs.map +1 -1
  341. package/dist/infra/port-ownership.cjs +57 -0
  342. package/dist/infra/port-ownership.cjs.map +1 -0
  343. package/dist/infra/port-ownership.mjs +57 -0
  344. package/dist/infra/port-ownership.mjs.map +1 -0
  345. package/dist/infra/preflight.cjs +45 -33
  346. package/dist/infra/preflight.cjs.map +1 -1
  347. package/dist/infra/preflight.d.cts +1 -0
  348. package/dist/infra/preflight.d.mts +1 -0
  349. package/dist/infra/preflight.mjs +46 -34
  350. package/dist/infra/preflight.mjs.map +1 -1
  351. package/dist/infra/types.cjs.map +1 -1
  352. package/dist/infra/types.d.cts +2 -0
  353. package/dist/infra/types.d.mts +2 -0
  354. package/dist/infra/types.mjs.map +1 -1
  355. package/dist/integrity.cjs +50 -61
  356. package/dist/integrity.cjs.map +1 -1
  357. package/dist/integrity.d.cts +16 -10
  358. package/dist/integrity.d.mts +16 -10
  359. package/dist/integrity.mjs +50 -59
  360. package/dist/integrity.mjs.map +1 -1
  361. package/dist/internal/manifest-normalizer.cjs +8 -2
  362. package/dist/internal/manifest-normalizer.cjs.map +1 -1
  363. package/dist/internal/manifest-normalizer.mjs +9 -3
  364. package/dist/internal/manifest-normalizer.mjs.map +1 -1
  365. package/dist/merge.cjs +19 -1
  366. package/dist/merge.cjs.map +1 -1
  367. package/dist/merge.d.cts +1 -1
  368. package/dist/merge.d.mts +1 -1
  369. package/dist/merge.mjs +19 -2
  370. package/dist/merge.mjs.map +1 -1
  371. package/dist/mf.cjs +190 -3
  372. package/dist/mf.cjs.map +1 -1
  373. package/dist/mf.d.cts +24 -2
  374. package/dist/mf.d.mts +24 -2
  375. package/dist/mf.mjs +189 -4
  376. package/dist/mf.mjs.map +1 -1
  377. package/dist/near-cli.cjs +59 -91
  378. package/dist/near-cli.cjs.map +1 -1
  379. package/dist/near-cli.mjs +58 -90
  380. package/dist/near-cli.mjs.map +1 -1
  381. package/dist/near-signer.cjs +73 -0
  382. package/dist/near-signer.cjs.map +1 -0
  383. package/dist/near-signer.mjs +70 -0
  384. package/dist/near-signer.mjs.map +1 -0
  385. package/dist/network.cjs +0 -1
  386. package/dist/network.cjs.map +1 -1
  387. package/dist/orchestrator.cjs +256 -87
  388. package/dist/orchestrator.cjs.map +1 -1
  389. package/dist/orchestrator.mjs +248 -87
  390. package/dist/orchestrator.mjs.map +1 -1
  391. package/dist/platform-deploy.cjs +81 -0
  392. package/dist/platform-deploy.cjs.map +1 -0
  393. package/dist/platform-deploy.mjs +80 -0
  394. package/dist/platform-deploy.mjs.map +1 -0
  395. package/dist/plugin.cjs +54 -1389
  396. package/dist/plugin.cjs.map +1 -1
  397. package/dist/plugin.d.cts +6 -896
  398. package/dist/plugin.d.mts +6 -896
  399. package/dist/plugin.mjs +53 -1387
  400. package/dist/plugin.mjs.map +1 -1
  401. package/dist/process-kill.cjs +44 -0
  402. package/dist/process-kill.cjs.map +1 -0
  403. package/dist/process-kill.mjs +43 -0
  404. package/dist/process-kill.mjs.map +1 -0
  405. package/dist/process-registry.cjs +64 -9
  406. package/dist/process-registry.cjs.map +1 -1
  407. package/dist/process-registry.mjs +61 -10
  408. package/dist/process-registry.mjs.map +1 -1
  409. package/dist/progress.cjs +45 -0
  410. package/dist/progress.cjs.map +1 -0
  411. package/dist/progress.d.cts +13 -0
  412. package/dist/progress.d.mts +13 -0
  413. package/dist/progress.mjs +42 -0
  414. package/dist/progress.mjs.map +1 -0
  415. package/dist/publish.cjs +513 -79
  416. package/dist/publish.cjs.map +1 -1
  417. package/dist/publish.mjs +515 -82
  418. package/dist/publish.mjs.map +1 -1
  419. package/dist/registry-use.cjs +41 -0
  420. package/dist/registry-use.cjs.map +1 -0
  421. package/dist/registry-use.mjs +40 -0
  422. package/dist/registry-use.mjs.map +1 -0
  423. package/dist/resolution/session.cjs +335 -0
  424. package/dist/resolution/session.cjs.map +1 -0
  425. package/dist/resolution/session.d.cts +105 -0
  426. package/dist/resolution/session.d.mts +105 -0
  427. package/dist/resolution/session.mjs +331 -0
  428. package/dist/resolution/session.mjs.map +1 -0
  429. package/dist/rollback.cjs +131 -0
  430. package/dist/rollback.cjs.map +1 -0
  431. package/dist/rollback.mjs +128 -0
  432. package/dist/rollback.mjs.map +1 -0
  433. package/dist/sdk.cjs +7 -7
  434. package/dist/sdk.d.cts +3 -3
  435. package/dist/sdk.d.mts +3 -3
  436. package/dist/sdk.mjs +2 -2
  437. package/dist/service-descriptor.cjs +67 -34
  438. package/dist/service-descriptor.cjs.map +1 -1
  439. package/dist/service-descriptor.d.cts +4 -1
  440. package/dist/service-descriptor.d.mts +3 -0
  441. package/dist/service-descriptor.mjs +63 -35
  442. package/dist/service-descriptor.mjs.map +1 -1
  443. package/dist/shared-deps.cjs +17 -16
  444. package/dist/shared-deps.cjs.map +1 -1
  445. package/dist/shared-deps.mjs +17 -16
  446. package/dist/shared-deps.mjs.map +1 -1
  447. package/dist/start-config-source.cjs +24 -0
  448. package/dist/start-config-source.cjs.map +1 -0
  449. package/dist/start-config-source.d.cts +29 -0
  450. package/dist/start-config-source.d.mts +29 -0
  451. package/dist/start-config-source.mjs +22 -0
  452. package/dist/start-config-source.mjs.map +1 -0
  453. package/dist/storage-upload.cjs +145 -0
  454. package/dist/storage-upload.cjs.map +1 -0
  455. package/dist/storage-upload.mjs +143 -0
  456. package/dist/storage-upload.mjs.map +1 -0
  457. package/dist/types.cjs +126 -20
  458. package/dist/types.cjs.map +1 -1
  459. package/dist/types.d.cts +867 -585
  460. package/dist/types.d.mts +867 -585
  461. package/dist/types.mjs +307 -208
  462. package/dist/types.mjs.map +1 -1
  463. package/dist/ui/api.cjs +105 -0
  464. package/dist/ui/api.cjs.map +1 -0
  465. package/dist/ui/api.d.cts +31 -0
  466. package/dist/ui/api.d.mts +31 -0
  467. package/dist/ui/api.mjs +99 -0
  468. package/dist/ui/api.mjs.map +1 -0
  469. package/dist/ui/auth-guards.cjs +50 -0
  470. package/dist/ui/auth-guards.cjs.map +1 -0
  471. package/dist/ui/auth-guards.d.cts +39 -0
  472. package/dist/ui/auth-guards.d.mts +39 -0
  473. package/dist/ui/auth-guards.mjs +48 -0
  474. package/dist/ui/auth-guards.mjs.map +1 -0
  475. package/dist/ui/auth.cjs +197 -0
  476. package/dist/ui/auth.cjs.map +1 -0
  477. package/dist/ui/auth.d.cts +56 -0
  478. package/dist/ui/auth.d.mts +56 -0
  479. package/dist/ui/auth.mjs +179 -0
  480. package/dist/ui/auth.mjs.map +1 -0
  481. package/dist/ui/entry.cjs +16 -0
  482. package/dist/ui/entry.cjs.map +1 -0
  483. package/dist/ui/entry.d.cts +12 -0
  484. package/dist/ui/entry.d.mts +12 -0
  485. package/dist/ui/entry.mjs +15 -0
  486. package/dist/ui/entry.mjs.map +1 -0
  487. package/dist/ui/head.cjs +14 -7
  488. package/dist/ui/head.cjs.map +1 -1
  489. package/dist/ui/head.mjs +15 -7
  490. package/dist/ui/head.mjs.map +1 -1
  491. package/dist/ui/hydrate.cjs +265 -0
  492. package/dist/ui/hydrate.cjs.map +1 -0
  493. package/dist/ui/hydrate.d.cts +48 -0
  494. package/dist/ui/hydrate.d.mts +48 -0
  495. package/dist/ui/hydrate.mjs +263 -0
  496. package/dist/ui/hydrate.mjs.map +1 -0
  497. package/dist/ui/i18n.cjs +153 -0
  498. package/dist/ui/i18n.cjs.map +1 -0
  499. package/dist/ui/i18n.d.cts +29 -0
  500. package/dist/ui/i18n.d.mts +29 -0
  501. package/dist/ui/i18n.mjs +140 -0
  502. package/dist/ui/i18n.mjs.map +1 -0
  503. package/dist/ui/index.cjs +19 -1
  504. package/dist/ui/index.d.cts +6 -3
  505. package/dist/ui/index.d.mts +6 -3
  506. package/dist/ui/index.mjs +5 -2
  507. package/dist/ui/locale.cjs +53 -0
  508. package/dist/ui/locale.cjs.map +1 -0
  509. package/dist/ui/locale.d.cts +18 -0
  510. package/dist/ui/locale.d.mts +18 -0
  511. package/dist/ui/locale.mjs +49 -0
  512. package/dist/ui/locale.mjs.map +1 -0
  513. package/dist/ui/manifest/index.cjs +25 -0
  514. package/dist/ui/manifest/index.cjs.map +1 -0
  515. package/dist/ui/manifest/index.d.cts +9 -0
  516. package/dist/ui/manifest/index.d.mts +9 -0
  517. package/dist/ui/manifest/index.mjs +13 -0
  518. package/dist/ui/manifest/index.mjs.map +1 -0
  519. package/dist/ui/manifest-generator.cjs +8 -0
  520. package/dist/ui/manifest-generator.d.cts +1 -0
  521. package/dist/ui/manifest-generator.d.mts +1 -0
  522. package/dist/ui/manifest-generator.mjs +3 -0
  523. package/dist/ui/message-catalogs.cjs +8 -0
  524. package/dist/ui/message-catalogs.cjs.map +1 -0
  525. package/dist/ui/message-catalogs.d.cts +5 -0
  526. package/dist/ui/message-catalogs.d.mts +5 -0
  527. package/dist/ui/message-catalogs.mjs +8 -0
  528. package/dist/ui/message-catalogs.mjs.map +1 -0
  529. package/dist/ui/metadata.cjs +0 -1
  530. package/dist/ui/metadata.cjs.map +1 -1
  531. package/dist/ui/metadata.d.cts +1 -1
  532. package/dist/ui/metadata.d.mts +1 -1
  533. package/dist/ui/plugin-path.cjs +37 -0
  534. package/dist/ui/plugin-path.cjs.map +1 -0
  535. package/dist/ui/plugin-path.d.cts +25 -0
  536. package/dist/ui/plugin-path.d.mts +25 -0
  537. package/dist/ui/plugin-path.mjs +35 -0
  538. package/dist/ui/plugin-path.mjs.map +1 -0
  539. package/dist/ui/router-client.cjs +61 -0
  540. package/dist/ui/router-client.cjs.map +1 -0
  541. package/dist/ui/router-client.d.cts +20 -0
  542. package/dist/ui/router-client.d.mts +20 -0
  543. package/dist/ui/router-client.mjs +60 -0
  544. package/dist/ui/router-client.mjs.map +1 -0
  545. package/dist/ui/router-defaults.cjs +48 -0
  546. package/dist/ui/router-defaults.cjs.map +1 -0
  547. package/dist/ui/router-defaults.d.cts +8 -0
  548. package/dist/ui/router-defaults.d.mts +8 -0
  549. package/dist/ui/router-defaults.mjs +45 -0
  550. package/dist/ui/router-defaults.mjs.map +1 -0
  551. package/dist/ui/router-error.cjs +70 -0
  552. package/dist/ui/router-error.cjs.map +1 -0
  553. package/dist/ui/router-error.d.cts +19 -0
  554. package/dist/ui/router-error.d.mts +19 -0
  555. package/dist/ui/router-error.mjs +69 -0
  556. package/dist/ui/router-error.mjs.map +1 -0
  557. package/dist/ui/router-server.cjs +153 -0
  558. package/dist/ui/router-server.cjs.map +1 -0
  559. package/dist/ui/router-server.d.cts +38 -0
  560. package/dist/ui/router-server.d.mts +38 -0
  561. package/dist/ui/router-server.mjs +152 -0
  562. package/dist/ui/router-server.mjs.map +1 -0
  563. package/dist/ui/router.cjs +4 -16
  564. package/dist/ui/router.cjs.map +1 -1
  565. package/dist/ui/router.mjs +4 -15
  566. package/dist/ui/router.mjs.map +1 -1
  567. package/dist/ui/runtime.cjs +5 -1
  568. package/dist/ui/runtime.cjs.map +1 -1
  569. package/dist/ui/runtime.d.cts +2 -1
  570. package/dist/ui/runtime.d.mts +2 -1
  571. package/dist/ui/runtime.mjs +5 -1
  572. package/dist/ui/runtime.mjs.map +1 -1
  573. package/dist/ui/slot.cjs +34 -0
  574. package/dist/ui/slot.cjs.map +1 -0
  575. package/dist/ui/slot.d.cts +43 -0
  576. package/dist/ui/slot.d.mts +43 -0
  577. package/dist/ui/slot.mjs +34 -0
  578. package/dist/ui/slot.mjs.map +1 -0
  579. package/dist/ui/tenant.cjs +300 -0
  580. package/dist/ui/tenant.cjs.map +1 -0
  581. package/dist/ui/tenant.d.cts +122 -0
  582. package/dist/ui/tenant.d.mts +122 -0
  583. package/dist/ui/tenant.mjs +279 -0
  584. package/dist/ui/tenant.mjs.map +1 -0
  585. package/dist/ui/types.d.cts +32 -2
  586. package/dist/ui/types.d.mts +32 -2
  587. package/dist/ui/version-check.cjs +47 -0
  588. package/dist/ui/version-check.cjs.map +1 -0
  589. package/dist/ui/version-check.d.cts +23 -0
  590. package/dist/ui/version-check.d.mts +23 -0
  591. package/dist/ui/version-check.mjs +46 -0
  592. package/dist/ui/version-check.mjs.map +1 -0
  593. package/dist/utils/banner.cjs +2 -2
  594. package/dist/utils/banner.cjs.map +1 -1
  595. package/dist/utils/banner.mjs +2 -2
  596. package/dist/utils/banner.mjs.map +1 -1
  597. package/dist/utils/linkify.cjs +1 -1
  598. package/dist/utils/linkify.cjs.map +1 -1
  599. package/dist/utils/linkify.mjs +1 -0
  600. package/dist/utils/linkify.mjs.map +1 -1
  601. package/dist/utils/run.cjs +6 -6
  602. package/dist/utils/run.cjs.map +1 -1
  603. package/dist/utils/run.mjs +6 -6
  604. package/dist/utils/run.mjs.map +1 -1
  605. package/dist/utils/save-config.cjs +12 -0
  606. package/dist/utils/save-config.cjs.map +1 -1
  607. package/dist/utils/save-config.mjs +12 -0
  608. package/dist/utils/save-config.mjs.map +1 -1
  609. package/dist/utils/snapshot-hash.cjs +10 -0
  610. package/dist/utils/snapshot-hash.cjs.map +1 -0
  611. package/dist/utils/snapshot-hash.mjs +10 -0
  612. package/dist/utils/snapshot-hash.mjs.map +1 -0
  613. package/dist/utils/string.cjs +0 -1
  614. package/dist/utils/string.cjs.map +1 -1
  615. package/dist/utils/theme.cjs +30 -12
  616. package/dist/utils/theme.cjs.map +1 -1
  617. package/dist/utils/theme.mjs +30 -11
  618. package/dist/utils/theme.mjs.map +1 -1
  619. package/dist/version-manifest-deploy.cjs +50 -0
  620. package/dist/version-manifest-deploy.cjs.map +1 -0
  621. package/dist/version-manifest-deploy.mjs +49 -0
  622. package/dist/version-manifest-deploy.mjs.map +1 -0
  623. package/dist/version-manifest-resolve.cjs +42 -0
  624. package/dist/version-manifest-resolve.cjs.map +1 -0
  625. package/dist/version-manifest-resolve.d.cts +38 -0
  626. package/dist/version-manifest-resolve.d.mts +38 -0
  627. package/dist/version-manifest-resolve.mjs +40 -0
  628. package/dist/version-manifest-resolve.mjs.map +1 -0
  629. package/dist/version-status.cjs +18 -0
  630. package/dist/version-status.cjs.map +1 -0
  631. package/dist/version-status.d.cts +22 -0
  632. package/dist/version-status.d.mts +22 -0
  633. package/dist/version-status.mjs +17 -0
  634. package/dist/version-status.mjs.map +1 -0
  635. package/dist/workspace-catalog.cjs +53 -0
  636. package/dist/workspace-catalog.cjs.map +1 -0
  637. package/dist/workspace-catalog.mjs +51 -0
  638. package/dist/workspace-catalog.mjs.map +1 -0
  639. package/dist/workspace.cjs +237 -0
  640. package/dist/workspace.cjs.map +1 -0
  641. package/dist/workspace.mjs +233 -0
  642. package/dist/workspace.mjs.map +1 -0
  643. package/package.json +179 -27
  644. package/skills/add-a-route/SKILL.md +132 -0
  645. package/skills/api-and-auth/SKILL.md +87 -21
  646. package/skills/api-and-auth/references/middleware.md +1 -1
  647. package/skills/cli-reference/SKILL.md +48 -21
  648. package/skills/code-style/SKILL.md +8 -0
  649. package/skills/dev-workflow/SKILL.md +50 -26
  650. package/skills/extends-config/SKILL.md +31 -19
  651. package/skills/init-upgrade/SKILL.md +29 -16
  652. package/skills/plugin-development/SKILL.md +46 -112
  653. package/skills/plugin-development/references/database.md +82 -0
  654. package/skills/plugin-development/references/request-context.md +67 -0
  655. package/skills/publish-sync/SKILL.md +99 -22
  656. package/skills/registry/SKILL.md +82 -0
  657. package/skills/super-app/SKILL.md +25 -15
  658. package/skills/talk-to-the-app/SKILL.md +138 -0
  659. package/skills/ui-integration/SKILL.md +93 -11
  660. package/dist/cli/db-studio.cjs +0 -131
  661. package/dist/cli/db-studio.cjs.map +0 -1
  662. package/dist/cli/db-studio.mjs +0 -127
  663. package/dist/cli/db-studio.mjs.map +0 -1
  664. package/dist/cli/init.d.cts.map +0 -1
  665. package/dist/cli/init.d.mts.map +0 -1
  666. package/dist/components/dev-view.cjs +0 -309
  667. package/dist/components/dev-view.cjs.map +0 -1
  668. package/dist/components/dev-view.mjs +0 -309
  669. package/dist/components/dev-view.mjs.map +0 -1
  670. package/dist/components/streaming-view.cjs +0 -134
  671. package/dist/components/streaming-view.cjs.map +0 -1
  672. package/dist/components/streaming-view.mjs +0 -132
  673. package/dist/components/streaming-view.mjs.map +0 -1
  674. package/dist/config.d.cts.map +0 -1
  675. package/dist/config.d.mts.map +0 -1
  676. package/dist/contract.d.cts.map +0 -1
  677. package/dist/contract.d.mts.map +0 -1
  678. package/dist/contract.meta.d.cts.map +0 -1
  679. package/dist/contract.meta.d.mts.map +0 -1
  680. package/dist/dag.d.cts.map +0 -1
  681. package/dist/dag.d.mts.map +0 -1
  682. package/dist/db.cjs +0 -81
  683. package/dist/db.cjs.map +0 -1
  684. package/dist/db.d.cts +0 -30
  685. package/dist/db.d.cts.map +0 -1
  686. package/dist/db.d.mts +0 -30
  687. package/dist/db.d.mts.map +0 -1
  688. package/dist/db.mjs +0 -75
  689. package/dist/db.mjs.map +0 -1
  690. package/dist/fastkv.d.cts.map +0 -1
  691. package/dist/fastkv.d.mts.map +0 -1
  692. package/dist/integrity.d.cts.map +0 -1
  693. package/dist/integrity.d.mts.map +0 -1
  694. package/dist/merge.d.cts.map +0 -1
  695. package/dist/merge.d.mts.map +0 -1
  696. package/dist/mf.d.cts.map +0 -1
  697. package/dist/mf.d.mts.map +0 -1
  698. package/dist/plugin.d.cts.map +0 -1
  699. package/dist/plugin.d.mts.map +0 -1
  700. package/dist/service-descriptor.d.cts.map +0 -1
  701. package/dist/service-descriptor.d.mts.map +0 -1
  702. package/dist/types.d.cts.map +0 -1
  703. package/dist/types.d.mts.map +0 -1
  704. package/dist/ui/head.d.cts.map +0 -1
  705. package/dist/ui/head.d.mts.map +0 -1
  706. package/dist/ui/metadata.d.cts.map +0 -1
  707. package/dist/ui/metadata.d.mts.map +0 -1
  708. package/dist/ui/router.d.cts.map +0 -1
  709. package/dist/ui/router.d.mts.map +0 -1
  710. package/dist/ui/runtime.d.cts.map +0 -1
  711. package/dist/ui/runtime.d.mts.map +0 -1
  712. package/dist/ui/types.d.cts.map +0 -1
  713. package/dist/ui/types.d.mts.map +0 -1
@@ -0,0 +1,131 @@
1
+ let node_crypto = require("node:crypto");
2
+
3
+ //#region src/rollback.ts
4
+ function collectPinnedSlots(config) {
5
+ const slots = [];
6
+ const app = config.app;
7
+ const plugins = config.plugins;
8
+ const push = (slot, ref) => {
9
+ if (ref && typeof ref === "object") slots.push({
10
+ slot,
11
+ ref
12
+ });
13
+ };
14
+ if (app) {
15
+ for (const key of [
16
+ "host",
17
+ "ui",
18
+ "api",
19
+ "auth"
20
+ ]) push(`app.${key}`, app[key]);
21
+ const auth = app.auth;
22
+ if (auth?.ui) push("app.auth.ui", auth.ui);
23
+ }
24
+ if (plugins) for (const [key, plugin] of Object.entries(plugins)) {
25
+ if (typeof plugin !== "object" || plugin === null) continue;
26
+ push(key, plugin);
27
+ const ui = plugin.ui;
28
+ if (ui) push(`${key}.ui`, ui);
29
+ }
30
+ return slots;
31
+ }
32
+ function pinOf(ref) {
33
+ const manifest = typeof ref.pin?.manifest === "string" ? ref.pin.manifest : void 0;
34
+ const integrity = typeof ref.pin?.integrity === "string" ? ref.pin.integrity : void 0;
35
+ return manifest && integrity ? {
36
+ manifest,
37
+ integrity
38
+ } : null;
39
+ }
40
+ /** Every pinned slot with both a production base and a verifiable pin. */
41
+ function collectSlotPinRefs(config) {
42
+ return collectPinnedSlots(config).map(({ slot, ref }) => {
43
+ const pin = pinOf(ref);
44
+ const base = typeof ref.production === "string" ? ref.production : void 0;
45
+ return pin && base ? {
46
+ slot,
47
+ base,
48
+ pin
49
+ } : null;
50
+ }).filter((entry) => entry !== null);
51
+ }
52
+ async function verifySlot(slot, ref, fetchImpl) {
53
+ const base = typeof ref.production === "string" ? ref.production : void 0;
54
+ const pin = pinOf(ref);
55
+ if (!pin) return {
56
+ slot,
57
+ ok: true
58
+ };
59
+ const { manifest, integrity } = pin;
60
+ if (!base) return {
61
+ slot,
62
+ manifest,
63
+ ok: false,
64
+ reason: "no production URL to fetch the manifest from"
65
+ };
66
+ const manifestUrl = `${base.replace(/\/$/, "")}/${manifest.replace(/^\//, "")}`;
67
+ try {
68
+ const response = await fetchImpl(manifestUrl);
69
+ if (!response.ok) return {
70
+ slot,
71
+ manifest,
72
+ ok: false,
73
+ reason: `manifest fetch failed: ${response.status}`
74
+ };
75
+ const body = await response.text();
76
+ const computed = `sha384-${(0, node_crypto.createHash)("sha384").update(body).digest("base64")}`;
77
+ if (computed !== integrity) return {
78
+ slot,
79
+ manifest,
80
+ ok: false,
81
+ reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`
82
+ };
83
+ return {
84
+ slot,
85
+ manifest,
86
+ ok: true
87
+ };
88
+ } catch (error) {
89
+ return {
90
+ slot,
91
+ manifest,
92
+ ok: false,
93
+ reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`
94
+ };
95
+ }
96
+ }
97
+ async function verifyRollbackSnapshot(config, opts) {
98
+ const fetchImpl = opts?.fetchImpl ?? fetch;
99
+ const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);
100
+ if (pinned.length === 0) return {
101
+ verifiable: false,
102
+ ok: false,
103
+ slots: []
104
+ };
105
+ const slots = await Promise.all(pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)));
106
+ return {
107
+ verifiable: true,
108
+ ok: slots.every((check) => check.ok),
109
+ slots
110
+ };
111
+ }
112
+ function summarizeSlotPins(config) {
113
+ const pinned = collectPinnedSlots(config).map((entry) => {
114
+ const pin = pinOf(entry.ref);
115
+ return pin ? `${entry.slot}=${pin.manifest}` : null;
116
+ }).filter(Boolean);
117
+ return pinned.length > 0 ? pinned.join(" ") : "no version pins (pre-pin snapshot)";
118
+ }
119
+ function buildRollbackPayload(targetConfig, rolledBackFrom) {
120
+ return {
121
+ ...targetConfig,
122
+ rolledBackFrom
123
+ };
124
+ }
125
+
126
+ //#endregion
127
+ exports.buildRollbackPayload = buildRollbackPayload;
128
+ exports.collectSlotPinRefs = collectSlotPinRefs;
129
+ exports.summarizeSlotPins = summarizeSlotPins;
130
+ exports.verifyRollbackSnapshot = verifyRollbackSnapshot;
131
+ //# sourceMappingURL=rollback.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.cjs","names":["createHash"],"sources":["../src/rollback.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfigInput } from \"./types\";\n\n/**\n * Rollback safety gate (atomic-deploys 11): before republishing a historical\n * snapshot, every pinned slot's version manifest must still serve and match\n * its SRI — Phase A made bytes additive and retention is keep-everything, so\n * a verify failure means the pointer is broken, never publishable. Snapshots\n * from before the pin existed cannot be verified this way; they are allowed\n * only with an explicit force (their bytes were overwritten in place), with\n * the caller expected to warn loudly.\n */\n\nexport interface RollbackSlotCheck {\n slot: string;\n manifest?: string;\n ok: boolean;\n reason?: string;\n}\n\nexport interface RollbackVerification {\n /** false = pre-pin snapshot with no verifiable pins (force required) */\n verifiable: boolean;\n ok: boolean;\n slots: RollbackSlotCheck[];\n}\n\ninterface PinnedSlotRef {\n production?: unknown;\n pin?: { manifest?: unknown; integrity?: unknown };\n}\n\nfunction collectPinnedSlots(config: BosConfigInput): Array<{ slot: string; ref: PinnedSlotRef }> {\n const slots: Array<{ slot: string; ref: PinnedSlotRef }> = [];\n const app = config.app as Record<string, PinnedSlotRef | undefined> | undefined;\n const plugins = config.plugins as Record<string, unknown> | undefined;\n\n const push = (slot: string, ref: unknown): void => {\n if (ref && typeof ref === \"object\") slots.push({ slot, ref: ref as PinnedSlotRef });\n };\n\n if (app) {\n for (const key of [\"host\", \"ui\", \"api\", \"auth\"] as const) push(`app.${key}`, app[key]);\n const auth = app.auth as { ui?: unknown } | undefined;\n if (auth?.ui) push(\"app.auth.ui\", auth.ui);\n }\n if (plugins) {\n for (const [key, plugin] of Object.entries(plugins)) {\n if (typeof plugin !== \"object\" || plugin === null) continue;\n push(key, plugin);\n const ui = (plugin as { ui?: unknown }).ui;\n if (ui) push(`${key}.ui`, ui);\n }\n }\n return slots;\n}\n\nfunction pinOf(ref: PinnedSlotRef): { manifest: string; integrity: string } | null {\n const manifest = typeof ref.pin?.manifest === \"string\" ? ref.pin.manifest : undefined;\n const integrity = typeof ref.pin?.integrity === \"string\" ? ref.pin.integrity : undefined;\n return manifest && integrity ? { manifest, integrity } : null;\n}\n\nexport interface SlotPinRef {\n slot: string;\n /** the slot's production base URL (…/bundles/<account>/<gateway>/<workspace>/) */\n base: string;\n pin: { manifest: string; integrity: string };\n}\n\n/** Every pinned slot with both a production base and a verifiable pin. */\nexport function collectSlotPinRefs(config: BosConfigInput): SlotPinRef[] {\n return collectPinnedSlots(config)\n .map(({ slot, ref }) => {\n const pin = pinOf(ref);\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n return pin && base ? { slot, base, pin } : null;\n })\n .filter((entry): entry is SlotPinRef => entry !== null);\n}\n\nasync function verifySlot(\n slot: string,\n ref: PinnedSlotRef,\n fetchImpl: typeof fetch,\n): Promise<RollbackSlotCheck> {\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n const pin = pinOf(ref);\n if (!pin) return { slot, ok: true };\n const { manifest, integrity } = pin;\n\n if (!base)\n return { slot, manifest, ok: false, reason: \"no production URL to fetch the manifest from\" };\n\n const manifestUrl = `${base.replace(/\\/$/, \"\")}/${manifest.replace(/^\\//, \"\")}`;\n try {\n const response = await fetchImpl(manifestUrl);\n if (!response.ok) {\n return { slot, manifest, ok: false, reason: `manifest fetch failed: ${response.status}` };\n }\n const body = await response.text();\n const computed = `sha384-${createHash(\"sha384\").update(body).digest(\"base64\")}`;\n if (computed !== integrity) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`,\n };\n }\n return { slot, manifest, ok: true };\n } catch (error) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport async function verifyRollbackSnapshot(\n config: BosConfigInput,\n opts?: { fetchImpl?: typeof fetch },\n): Promise<RollbackVerification> {\n const fetchImpl = opts?.fetchImpl ?? fetch;\n const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);\n\n if (pinned.length === 0) {\n return { verifiable: false, ok: false, slots: [] };\n }\n\n const slots = await Promise.all(\n pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)),\n );\n return { verifiable: true, ok: slots.every((check) => check.ok), slots };\n}\n\nexport function summarizeSlotPins(config: BosConfigInput): string {\n const pinned = collectPinnedSlots(config)\n .map((entry) => {\n const pin = pinOf(entry.ref);\n return pin ? `${entry.slot}=${pin.manifest}` : null;\n })\n .filter(Boolean) as string[];\n return pinned.length > 0 ? pinned.join(\" \") : \"no version pins (pre-pin snapshot)\";\n}\n\nexport function buildRollbackPayload<T extends Record<string, unknown>>(\n targetConfig: T,\n rolledBackFrom: string,\n): T {\n return { ...targetConfig, rolledBackFrom } as T;\n}\n"],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ //#region src/rollback.ts
4
+ function collectPinnedSlots(config) {
5
+ const slots = [];
6
+ const app = config.app;
7
+ const plugins = config.plugins;
8
+ const push = (slot, ref) => {
9
+ if (ref && typeof ref === "object") slots.push({
10
+ slot,
11
+ ref
12
+ });
13
+ };
14
+ if (app) {
15
+ for (const key of [
16
+ "host",
17
+ "ui",
18
+ "api",
19
+ "auth"
20
+ ]) push(`app.${key}`, app[key]);
21
+ const auth = app.auth;
22
+ if (auth?.ui) push("app.auth.ui", auth.ui);
23
+ }
24
+ if (plugins) for (const [key, plugin] of Object.entries(plugins)) {
25
+ if (typeof plugin !== "object" || plugin === null) continue;
26
+ push(key, plugin);
27
+ const ui = plugin.ui;
28
+ if (ui) push(`${key}.ui`, ui);
29
+ }
30
+ return slots;
31
+ }
32
+ function pinOf(ref) {
33
+ const manifest = typeof ref.pin?.manifest === "string" ? ref.pin.manifest : void 0;
34
+ const integrity = typeof ref.pin?.integrity === "string" ? ref.pin.integrity : void 0;
35
+ return manifest && integrity ? {
36
+ manifest,
37
+ integrity
38
+ } : null;
39
+ }
40
+ /** Every pinned slot with both a production base and a verifiable pin. */
41
+ function collectSlotPinRefs(config) {
42
+ return collectPinnedSlots(config).map(({ slot, ref }) => {
43
+ const pin = pinOf(ref);
44
+ const base = typeof ref.production === "string" ? ref.production : void 0;
45
+ return pin && base ? {
46
+ slot,
47
+ base,
48
+ pin
49
+ } : null;
50
+ }).filter((entry) => entry !== null);
51
+ }
52
+ async function verifySlot(slot, ref, fetchImpl) {
53
+ const base = typeof ref.production === "string" ? ref.production : void 0;
54
+ const pin = pinOf(ref);
55
+ if (!pin) return {
56
+ slot,
57
+ ok: true
58
+ };
59
+ const { manifest, integrity } = pin;
60
+ if (!base) return {
61
+ slot,
62
+ manifest,
63
+ ok: false,
64
+ reason: "no production URL to fetch the manifest from"
65
+ };
66
+ const manifestUrl = `${base.replace(/\/$/, "")}/${manifest.replace(/^\//, "")}`;
67
+ try {
68
+ const response = await fetchImpl(manifestUrl);
69
+ if (!response.ok) return {
70
+ slot,
71
+ manifest,
72
+ ok: false,
73
+ reason: `manifest fetch failed: ${response.status}`
74
+ };
75
+ const body = await response.text();
76
+ const computed = `sha384-${createHash("sha384").update(body).digest("base64")}`;
77
+ if (computed !== integrity) return {
78
+ slot,
79
+ manifest,
80
+ ok: false,
81
+ reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`
82
+ };
83
+ return {
84
+ slot,
85
+ manifest,
86
+ ok: true
87
+ };
88
+ } catch (error) {
89
+ return {
90
+ slot,
91
+ manifest,
92
+ ok: false,
93
+ reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`
94
+ };
95
+ }
96
+ }
97
+ async function verifyRollbackSnapshot(config, opts) {
98
+ const fetchImpl = opts?.fetchImpl ?? fetch;
99
+ const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);
100
+ if (pinned.length === 0) return {
101
+ verifiable: false,
102
+ ok: false,
103
+ slots: []
104
+ };
105
+ const slots = await Promise.all(pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)));
106
+ return {
107
+ verifiable: true,
108
+ ok: slots.every((check) => check.ok),
109
+ slots
110
+ };
111
+ }
112
+ function summarizeSlotPins(config) {
113
+ const pinned = collectPinnedSlots(config).map((entry) => {
114
+ const pin = pinOf(entry.ref);
115
+ return pin ? `${entry.slot}=${pin.manifest}` : null;
116
+ }).filter(Boolean);
117
+ return pinned.length > 0 ? pinned.join(" ") : "no version pins (pre-pin snapshot)";
118
+ }
119
+ function buildRollbackPayload(targetConfig, rolledBackFrom) {
120
+ return {
121
+ ...targetConfig,
122
+ rolledBackFrom
123
+ };
124
+ }
125
+
126
+ //#endregion
127
+ export { buildRollbackPayload, collectSlotPinRefs, summarizeSlotPins, verifyRollbackSnapshot };
128
+ //# sourceMappingURL=rollback.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.mjs","names":[],"sources":["../src/rollback.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfigInput } from \"./types\";\n\n/**\n * Rollback safety gate (atomic-deploys 11): before republishing a historical\n * snapshot, every pinned slot's version manifest must still serve and match\n * its SRI — Phase A made bytes additive and retention is keep-everything, so\n * a verify failure means the pointer is broken, never publishable. Snapshots\n * from before the pin existed cannot be verified this way; they are allowed\n * only with an explicit force (their bytes were overwritten in place), with\n * the caller expected to warn loudly.\n */\n\nexport interface RollbackSlotCheck {\n slot: string;\n manifest?: string;\n ok: boolean;\n reason?: string;\n}\n\nexport interface RollbackVerification {\n /** false = pre-pin snapshot with no verifiable pins (force required) */\n verifiable: boolean;\n ok: boolean;\n slots: RollbackSlotCheck[];\n}\n\ninterface PinnedSlotRef {\n production?: unknown;\n pin?: { manifest?: unknown; integrity?: unknown };\n}\n\nfunction collectPinnedSlots(config: BosConfigInput): Array<{ slot: string; ref: PinnedSlotRef }> {\n const slots: Array<{ slot: string; ref: PinnedSlotRef }> = [];\n const app = config.app as Record<string, PinnedSlotRef | undefined> | undefined;\n const plugins = config.plugins as Record<string, unknown> | undefined;\n\n const push = (slot: string, ref: unknown): void => {\n if (ref && typeof ref === \"object\") slots.push({ slot, ref: ref as PinnedSlotRef });\n };\n\n if (app) {\n for (const key of [\"host\", \"ui\", \"api\", \"auth\"] as const) push(`app.${key}`, app[key]);\n const auth = app.auth as { ui?: unknown } | undefined;\n if (auth?.ui) push(\"app.auth.ui\", auth.ui);\n }\n if (plugins) {\n for (const [key, plugin] of Object.entries(plugins)) {\n if (typeof plugin !== \"object\" || plugin === null) continue;\n push(key, plugin);\n const ui = (plugin as { ui?: unknown }).ui;\n if (ui) push(`${key}.ui`, ui);\n }\n }\n return slots;\n}\n\nfunction pinOf(ref: PinnedSlotRef): { manifest: string; integrity: string } | null {\n const manifest = typeof ref.pin?.manifest === \"string\" ? ref.pin.manifest : undefined;\n const integrity = typeof ref.pin?.integrity === \"string\" ? ref.pin.integrity : undefined;\n return manifest && integrity ? { manifest, integrity } : null;\n}\n\nexport interface SlotPinRef {\n slot: string;\n /** the slot's production base URL (…/bundles/<account>/<gateway>/<workspace>/) */\n base: string;\n pin: { manifest: string; integrity: string };\n}\n\n/** Every pinned slot with both a production base and a verifiable pin. */\nexport function collectSlotPinRefs(config: BosConfigInput): SlotPinRef[] {\n return collectPinnedSlots(config)\n .map(({ slot, ref }) => {\n const pin = pinOf(ref);\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n return pin && base ? { slot, base, pin } : null;\n })\n .filter((entry): entry is SlotPinRef => entry !== null);\n}\n\nasync function verifySlot(\n slot: string,\n ref: PinnedSlotRef,\n fetchImpl: typeof fetch,\n): Promise<RollbackSlotCheck> {\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n const pin = pinOf(ref);\n if (!pin) return { slot, ok: true };\n const { manifest, integrity } = pin;\n\n if (!base)\n return { slot, manifest, ok: false, reason: \"no production URL to fetch the manifest from\" };\n\n const manifestUrl = `${base.replace(/\\/$/, \"\")}/${manifest.replace(/^\\//, \"\")}`;\n try {\n const response = await fetchImpl(manifestUrl);\n if (!response.ok) {\n return { slot, manifest, ok: false, reason: `manifest fetch failed: ${response.status}` };\n }\n const body = await response.text();\n const computed = `sha384-${createHash(\"sha384\").update(body).digest(\"base64\")}`;\n if (computed !== integrity) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`,\n };\n }\n return { slot, manifest, ok: true };\n } catch (error) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport async function verifyRollbackSnapshot(\n config: BosConfigInput,\n opts?: { fetchImpl?: typeof fetch },\n): Promise<RollbackVerification> {\n const fetchImpl = opts?.fetchImpl ?? fetch;\n const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);\n\n if (pinned.length === 0) {\n return { verifiable: false, ok: false, slots: [] };\n }\n\n const slots = await Promise.all(\n pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)),\n );\n return { verifiable: true, ok: slots.every((check) => check.ok), slots };\n}\n\nexport function summarizeSlotPins(config: BosConfigInput): string {\n const pinned = collectPinnedSlots(config)\n .map((entry) => {\n const pin = pinOf(entry.ref);\n return pin ? `${entry.slot}=${pin.manifest}` : null;\n })\n .filter(Boolean) as string[];\n return pinned.length > 0 ? pinned.join(\" \") : \"no version pins (pre-pin snapshot)\";\n}\n\nexport function buildRollbackPayload<T extends Record<string, unknown>>(\n targetConfig: T,\n rolledBackFrom: string,\n): T {\n return { ...targetConfig, rolledBackFrom } as T;\n}\n"],"mappings":"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"}
package/dist/sdk.cjs CHANGED
@@ -1,25 +1,25 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ let effect = require("effect");
2
3
  let zod = require("zod");
4
+ let _orpc_contract = require("@orpc/contract");
3
5
  let every_plugin = require("every-plugin");
4
- let every_plugin_effect = require("every-plugin/effect");
5
- let every_plugin_orpc = require("every-plugin/orpc");
6
6
 
7
7
  Object.defineProperty(exports, 'Context', {
8
8
  enumerable: true,
9
9
  get: function () {
10
- return every_plugin_effect.Context;
10
+ return effect.Context;
11
11
  }
12
12
  });
13
13
  Object.defineProperty(exports, 'Effect', {
14
14
  enumerable: true,
15
15
  get: function () {
16
- return every_plugin_effect.Effect;
16
+ return effect.Effect;
17
17
  }
18
18
  });
19
19
  Object.defineProperty(exports, 'Layer', {
20
20
  enumerable: true,
21
21
  get: function () {
22
- return every_plugin_effect.Layer;
22
+ return effect.Layer;
23
23
  }
24
24
  });
25
25
  Object.defineProperty(exports, 'PluginRuntime', {
@@ -31,7 +31,7 @@ Object.defineProperty(exports, 'PluginRuntime', {
31
31
  Object.defineProperty(exports, 'Scope', {
32
32
  enumerable: true,
33
33
  get: function () {
34
- return every_plugin_effect.Scope;
34
+ return effect.Scope;
35
35
  }
36
36
  });
37
37
  Object.defineProperty(exports, 'createPlugin', {
@@ -49,7 +49,7 @@ Object.defineProperty(exports, 'createPluginRuntime', {
49
49
  Object.defineProperty(exports, 'oc', {
50
50
  enumerable: true,
51
51
  get: function () {
52
- return every_plugin_orpc.oc;
52
+ return _orpc_contract.oc;
53
53
  }
54
54
  });
55
55
  Object.defineProperty(exports, 'z', {
package/dist/sdk.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { Context, Effect, Layer, Scope } from "effect";
3
+ import { AnySchema, RouterContract, oc } from "@orpc/contract";
2
4
  import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
3
- import { Context, Effect, Layer, Scope } from "every-plugin/effect";
4
- import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
5
- export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
5
+ export { type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, type RouterContract, Scope, createPlugin, createPluginRuntime, oc, z };
package/dist/sdk.d.mts CHANGED
@@ -1,5 +1,5 @@
1
+ import { Context, Effect, Layer, Scope } from "effect";
1
2
  import { z } from "zod";
3
+ import { AnySchema, RouterContract, oc } from "@orpc/contract";
2
4
  import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
3
- import { Context, Effect, Layer, Scope } from "every-plugin/effect";
4
- import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
5
- export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
5
+ export { type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, type RouterContract, Scope, createPlugin, createPluginRuntime, oc, z };
package/dist/sdk.mjs CHANGED
@@ -1,6 +1,6 @@
1
+ import { Context, Effect, Layer, Scope } from "effect";
1
2
  import { z } from "zod";
3
+ import { oc } from "@orpc/contract";
2
4
  import { PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
3
- import { Context, Effect, Layer, Scope } from "every-plugin/effect";
4
- import { oc } from "every-plugin/orpc";
5
5
 
6
6
  export { Context, Effect, Layer, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
@@ -1,30 +1,57 @@
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ let node_fs = require("node:fs");
3
+ let node_path = require("node:path");
4
+ node_path = require_runtime.__toESM(node_path, 1);
1
5
  let effect = require("effect");
2
6
 
3
7
  //#region src/service-descriptor.ts
4
- var ServiceDescriptorMap = class extends effect.Context.Tag("ServiceDescriptorMap")() {};
5
- var DevRuntimeConfig = class extends effect.Context.Tag("DevRuntimeConfig")() {};
8
+ /**
9
+ * True when a `plugins.<id>` entry is the runtime-config mirror of the
10
+ * app-slot auth plugin (same backend target) — the `auth` service already
11
+ * spawns that backend, so the mirror contributes only its `ui` surface.
12
+ * The single implementation; consumed by the service descriptors, the DAG,
13
+ * the infra planner, and the dev session.
14
+ */
15
+ function isAuthMirrorPluginEntry(authEntry, pluginId, pluginConfig) {
16
+ if (pluginId !== "auth" || !authEntry) return false;
17
+ if (pluginConfig === authEntry) return true;
18
+ if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;
19
+ if (!pluginConfig.localPath && pluginConfig.source === "remote" && pluginConfig.url && pluginConfig.url === authEntry.url) return true;
20
+ return false;
21
+ }
22
+ var ServiceDescriptorMap = class extends effect.Context.Service()("ServiceDescriptorMap") {};
23
+ var DevRuntimeConfig = class extends effect.Context.Service()("DevRuntimeConfig") {};
24
+ var DevGeneratedEnv = class extends effect.Context.Service()("DevGeneratedEnv") {};
25
+ const DevGeneratedEnvLive = (env) => effect.Layer.succeed(DevGeneratedEnv, env);
6
26
  const PLUGIN_READY_PATTERNS = [
7
27
  /ready in/i,
8
28
  /compiled.*successfully/i,
9
29
  /listening/i,
10
30
  /started/i
11
31
  ];
12
- const PLUGIN_ERROR_PATTERNS = [/error/i, /failed/i];
32
+ const PLUGIN_ERROR_PATTERNS = [
33
+ /\bERROR in\b/,
34
+ /failed to compile/i,
35
+ /Module not found/i,
36
+ /Cannot find module/i
37
+ ];
13
38
  const SERVICE_CONFIGS = {
14
39
  host: {
15
- command: "bun",
40
+ command: "pnpm",
16
41
  args: ["run", "dev"],
42
+ env: { NODE_OPTIONS: "--conditions=development" },
17
43
  readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],
18
44
  errorPatterns: [
19
- /error:/i,
20
- /failed/i,
45
+ /\berror\b(?!s)/i,
46
+ /\bfailed to\b/i,
47
+ /\bbuild failed\b/i,
21
48
  /exception/i
22
49
  ],
23
50
  defaultPort: 3e3,
24
51
  readinessPath: "/health"
25
52
  },
26
53
  auth: {
27
- command: "bun",
54
+ command: "pnpm",
28
55
  args: ["run", "dev"],
29
56
  readyPatterns: PLUGIN_READY_PATTERNS,
30
57
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -32,27 +59,23 @@ const SERVICE_CONFIGS = {
32
59
  readinessPath: "/remoteEntry.js"
33
60
  },
34
61
  ui: {
35
- command: "bun",
62
+ command: "pnpm",
36
63
  args: ["run", "dev"],
37
64
  readyPatterns: [
38
65
  /\bready\s+built in\b/i,
39
66
  /\bLocal:\b/i,
40
67
  /\bcompiled\b.*successfully/i
41
68
  ],
42
- errorPatterns: [/error/i, /failed to compile/i],
69
+ errorPatterns: [
70
+ /\berror\b(?!s)/i,
71
+ /\bfailed to\b/i,
72
+ /\bbuild failed\b/i
73
+ ],
43
74
  defaultPort: 3003,
44
75
  readinessPath: "/remoteEntry.js"
45
76
  },
46
- "ui-ssr": {
47
- command: "bun",
48
- args: ["run", "dev:ssr"],
49
- readyPatterns: [/\bready\s+built in\b/i, /\bcompiled\b.*successfully/i],
50
- errorPatterns: [/error/i, /failed/i],
51
- defaultPort: 3004,
52
- readinessPath: "/"
53
- },
54
77
  api: {
55
- command: "bun",
78
+ command: "pnpm",
56
79
  args: ["run", "dev"],
57
80
  readyPatterns: PLUGIN_READY_PATTERNS,
58
81
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -89,17 +112,9 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
89
112
  port: runtimeConfig.ui.port,
90
113
  integrity: runtimeConfig.ui.integrity,
91
114
  ssr,
92
- ...SERVICE_CONFIGS.ui
93
- });
94
- if (ssr && runtimeConfig.ui.source === "local") map.set("ui-ssr", {
95
- key: "ui-ssr",
96
- source: runtimeConfig.ui.source,
97
- url: runtimeConfig.ui.ssrUrl ?? "",
98
- entry: "",
99
- name: "ui-ssr",
100
- localPath: runtimeConfig.ui.localPath,
101
- port: runtimeConfig.ui.ssrUrl ? Number.parseInt(new URL(runtimeConfig.ui.ssrUrl).port, 10) : (runtimeConfig.ui.port ?? 3003) + 1,
102
- ...SERVICE_CONFIGS["ui-ssr"]
115
+ ...SERVICE_CONFIGS.ui,
116
+ env: { BOS_DEV_SERVER: "1" },
117
+ args: process.env.BOS_NO_WATCH === "1" ? ["run", "dev:built"] : SERVICE_CONFIGS.ui.args
103
118
  });
104
119
  map.set("api", {
105
120
  key: "api",
@@ -134,10 +149,15 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
134
149
  if (runtimeConfig.plugins) {
135
150
  let pluginBasePort = 3010;
136
151
  for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {
152
+ const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);
137
153
  const pluginKey = `plugin:${pluginId}`;
138
154
  const resolvedPort = pluginConfig.port ?? pluginBasePort;
139
155
  pluginBasePort = resolvedPort + 1;
140
- map.set(pluginKey, {
156
+ const uiLocalPath = pluginConfig.ui?.localPath;
157
+ const isFolderFormUi = Boolean(uiLocalPath && pluginConfig.ui?.source === "local" && (0, node_fs.existsSync)(node_path.default.join(uiLocalPath, "src", "routes")) && !(0, node_fs.existsSync)(node_path.default.join(uiLocalPath, "package.json")));
158
+ const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;
159
+ if (isFolderFormUi) pluginBasePort = folderUiPort + 1;
160
+ if (!isAuthMirror) map.set(pluginKey, {
141
161
  key: pluginKey,
142
162
  source: pluginConfig.source,
143
163
  url: pluginConfig.url,
@@ -150,14 +170,24 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
150
170
  proxy: pluginConfig.proxy,
151
171
  variables: pluginConfig.variables,
152
172
  secrets: pluginConfig.secrets,
153
- command: "bun",
173
+ command: "pnpm",
154
174
  args: ["run", "dev"],
175
+ env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : void 0,
176
+ uiPort: isFolderFormUi ? folderUiPort : void 0,
155
177
  readyPatterns: PLUGIN_READY_PATTERNS,
156
178
  errorPatterns: PLUGIN_ERROR_PATTERNS,
157
179
  defaultPort: resolvedPort,
158
180
  readinessPath: "/remoteEntry.js"
159
181
  });
160
- if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local") {
182
+ else if (isFolderFormUi) {
183
+ const authDescriptor = map.get("auth");
184
+ if (authDescriptor) map.set("auth", {
185
+ ...authDescriptor,
186
+ env: { BOS_UI_PORT: String(folderUiPort) },
187
+ uiPort: folderUiPort
188
+ });
189
+ }
190
+ if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local" && !isFolderFormUi) {
161
191
  const uiKey = `plugin-ui:${pluginId}`;
162
192
  const uiPort = pluginConfig.ui.port ?? pluginBasePort;
163
193
  pluginBasePort = uiPort + 1;
@@ -170,7 +200,7 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
170
200
  localPath: pluginConfig.ui.localPath,
171
201
  port: uiPort,
172
202
  integrity: pluginConfig.ui.integrity,
173
- command: "bun",
203
+ command: "pnpm",
174
204
  args: ["run", "dev"],
175
205
  readyPatterns: PLUGIN_READY_PATTERNS,
176
206
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -188,7 +218,7 @@ function buildServiceDescriptorMapFromPlan(plan, options) {
188
218
  return buildServiceDescriptorMap(plan.runtimeConfig, options);
189
219
  }
190
220
  function buildDescription(map) {
191
- const descriptors = [...map.values()].filter((d) => d.key !== "ui-ssr" && !d.key.startsWith("plugin:"));
221
+ const descriptors = [...map.values()].filter((d) => !d.key.startsWith("plugin:"));
192
222
  const allLocal = descriptors.every((d) => d.source === "local");
193
223
  const hasProxy = [...map.values()].some((d) => d.proxy && d.source === "local");
194
224
  if (allLocal && !hasProxy) return "Full Local Development";
@@ -202,6 +232,8 @@ function buildDescription(map) {
202
232
  }
203
233
 
204
234
  //#endregion
235
+ exports.DevGeneratedEnv = DevGeneratedEnv;
236
+ exports.DevGeneratedEnvLive = DevGeneratedEnvLive;
205
237
  exports.DevRuntimeConfig = DevRuntimeConfig;
206
238
  exports.DevRuntimeConfigLive = DevRuntimeConfigLive;
207
239
  exports.ServiceDescriptorMap = ServiceDescriptorMap;
@@ -209,4 +241,5 @@ exports.ServiceDescriptorMapLive = ServiceDescriptorMapLive;
209
241
  exports.buildDescription = buildDescription;
210
242
  exports.buildServiceDescriptorMap = buildServiceDescriptorMap;
211
243
  exports.buildServiceDescriptorMapFromPlan = buildServiceDescriptorMapFromPlan;
244
+ exports.isAuthMirrorPluginEntry = isAuthMirrorPluginEntry;
212
245
  //# sourceMappingURL=service-descriptor.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-descriptor.cjs","names":["Context","Layer"],"sources":["../src/service-descriptor.ts"],"sourcesContent":["import { Context, Layer } from \"effect\";\nimport type { JsonObject, RuntimeConfig, SourceMode } from \"./types\";\n\nexport interface ServiceDescriptor {\n key: string;\n source: SourceMode;\n url: string;\n remoteUrl?: string;\n entry: string;\n name: string;\n localPath?: string;\n port?: number;\n readinessPath: string;\n defaultPort: number;\n integrity?: string;\n proxy?: string;\n variables?: JsonObject;\n secrets?: string[];\n ssr?: boolean;\n command?: string;\n args?: string[];\n readyPatterns?: RegExp[];\n errorPatterns?: RegExp[];\n}\n\nexport class ServiceDescriptorMap extends Context.Tag(\"ServiceDescriptorMap\")<\n ServiceDescriptorMap,\n Map<string, ServiceDescriptor>\n>() {}\n\nexport class DevRuntimeConfig extends Context.Tag(\"DevRuntimeConfig\")<\n DevRuntimeConfig,\n RuntimeConfig\n>() {}\n\nconst PLUGIN_READY_PATTERNS = [/ready in/i, /compiled.*successfully/i, /listening/i, /started/i];\n\nconst PLUGIN_ERROR_PATTERNS = [/error/i, /failed/i];\n\nconst SERVICE_CONFIGS: Record<\n string,\n Pick<\n ServiceDescriptor,\n \"command\" | \"args\" | \"readyPatterns\" | \"errorPatterns\" | \"defaultPort\" | \"readinessPath\"\n >\n> = {\n host: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],\n errorPatterns: [/error:/i, /failed/i, /exception/i],\n defaultPort: 3000,\n readinessPath: \"/health\",\n },\n auth: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3002,\n readinessPath: \"/remoteEntry.js\",\n },\n ui: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bLocal:\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/error/i, /failed to compile/i],\n defaultPort: 3003,\n readinessPath: \"/remoteEntry.js\",\n },\n \"ui-ssr\": {\n command: \"bun\",\n args: [\"run\", \"dev:ssr\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/error/i, /failed/i],\n defaultPort: 3004,\n readinessPath: \"/\",\n },\n api: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3001,\n readinessPath: \"/remoteEntry.js\",\n },\n};\n\nexport function buildServiceDescriptorMap(\n runtimeConfig: RuntimeConfig,\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n const map = new Map<string, ServiceDescriptor>();\n const ssr = options?.ssr ?? false;\n\n const hostIsRemote = runtimeConfig.host.source === \"remote\";\n const hostProbeUrl = hostIsRemote\n ? (runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url)\n : runtimeConfig.host.url;\n map.set(\"host\", {\n key: \"host\",\n source: runtimeConfig.host.source,\n url: hostProbeUrl,\n remoteUrl: runtimeConfig.host.remoteUrl,\n entry: hostIsRemote\n ? hostProbeUrl\n ? `${hostProbeUrl}/mf-manifest.json`\n : \"/mf-manifest.json\"\n : runtimeConfig.host.entry,\n name: runtimeConfig.host.name,\n localPath: runtimeConfig.host.localPath,\n port: runtimeConfig.host.port,\n integrity: runtimeConfig.host.integrity,\n secrets: runtimeConfig.host.secrets,\n ...SERVICE_CONFIGS.host,\n });\n\n map.set(\"ui\", {\n key: \"ui\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.url,\n remoteUrl: runtimeConfig.ui.source === \"remote\" ? runtimeConfig.ui.url : undefined,\n entry: runtimeConfig.ui.entry,\n name: runtimeConfig.ui.name,\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.port,\n integrity: runtimeConfig.ui.integrity,\n ssr,\n ...SERVICE_CONFIGS.ui,\n });\n\n if (ssr && runtimeConfig.ui.source === \"local\") {\n map.set(\"ui-ssr\", {\n key: \"ui-ssr\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.ssrUrl ?? \"\",\n entry: \"\",\n name: \"ui-ssr\",\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.ssrUrl\n ? Number.parseInt(new URL(runtimeConfig.ui.ssrUrl).port, 10)\n : (runtimeConfig.ui.port ?? 3003) + 1,\n ...SERVICE_CONFIGS[\"ui-ssr\"],\n });\n }\n\n map.set(\"api\", {\n key: \"api\",\n source: runtimeConfig.api.source,\n url: runtimeConfig.api.url,\n remoteUrl: runtimeConfig.api.source === \"remote\" ? runtimeConfig.api.url : undefined,\n entry: runtimeConfig.api.entry,\n name: runtimeConfig.api.name,\n localPath: runtimeConfig.api.localPath,\n port: runtimeConfig.api.port,\n integrity: runtimeConfig.api.integrity,\n proxy: runtimeConfig.api.proxy,\n variables: runtimeConfig.api.variables,\n secrets: runtimeConfig.api.secrets,\n ...SERVICE_CONFIGS.api,\n });\n\n if (runtimeConfig.auth) {\n map.set(\"auth\", {\n key: \"auth\",\n source: runtimeConfig.auth.source,\n url: runtimeConfig.auth.url,\n remoteUrl: runtimeConfig.auth.source === \"remote\" ? runtimeConfig.auth.url : undefined,\n entry: runtimeConfig.auth.entry,\n name: runtimeConfig.auth.name,\n localPath: runtimeConfig.auth.localPath,\n port: runtimeConfig.auth.port,\n integrity: runtimeConfig.auth.integrity,\n proxy: runtimeConfig.auth.proxy,\n variables: runtimeConfig.auth.variables,\n secrets: runtimeConfig.auth.secrets,\n ...SERVICE_CONFIGS.auth,\n });\n }\n\n if (runtimeConfig.plugins) {\n let pluginBasePort = 3010;\n for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {\n const pluginKey = `plugin:${pluginId}`;\n const resolvedPort = pluginConfig.port ?? pluginBasePort;\n pluginBasePort = resolvedPort + 1;\n\n map.set(pluginKey, {\n key: pluginKey,\n source: pluginConfig.source,\n url: pluginConfig.url,\n remoteUrl: pluginConfig.source === \"remote\" ? pluginConfig.url : undefined,\n entry: pluginConfig.entry,\n name: pluginConfig.name,\n localPath: pluginConfig.localPath,\n port: resolvedPort,\n integrity: pluginConfig.integrity,\n proxy: pluginConfig.proxy,\n variables: pluginConfig.variables,\n secrets: pluginConfig.secrets,\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: resolvedPort,\n readinessPath: \"/remoteEntry.js\",\n });\n\n if (pluginConfig.ui?.localPath && pluginConfig.ui.source === \"local\") {\n const uiKey = `plugin-ui:${pluginId}`;\n const uiPort = pluginConfig.ui.port ?? pluginBasePort;\n pluginBasePort = uiPort + 1;\n\n map.set(uiKey, {\n key: uiKey,\n source: pluginConfig.ui.source,\n url: pluginConfig.ui.url,\n entry: pluginConfig.ui.entry,\n name: pluginConfig.ui.name,\n localPath: pluginConfig.ui.localPath,\n port: uiPort,\n integrity: pluginConfig.ui.integrity,\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: uiPort,\n readinessPath: \"/remoteEntry.js\",\n });\n }\n }\n }\n\n return map;\n}\n\nexport interface AppOrchestrator {\n packages: string[];\n description: string;\n env: Record<string, string>;\n port?: number;\n interactive?: boolean;\n noLogs?: boolean;\n}\n\nexport const ServiceDescriptorMapLive = (map: Map<string, ServiceDescriptor>) =>\n Layer.succeed(ServiceDescriptorMap, map);\n\nexport const DevRuntimeConfigLive = (config: RuntimeConfig) =>\n Layer.succeed(DevRuntimeConfig, config);\n\nexport function buildServiceDescriptorMapFromPlan(\n plan: {\n runtimeConfig: RuntimeConfig;\n resolvedPorts: { host?: number; api?: number; auth?: number; ui?: number; uiSsr?: number };\n },\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n return buildServiceDescriptorMap(plan.runtimeConfig, options);\n}\n\ninterface ServiceDescriptorInfo {\n key: string;\n source: string;\n proxy?: string;\n}\n\nexport function buildDescription(map: Map<string, ServiceDescriptorInfo>): string {\n const descriptors = [...map.values()].filter(\n (d) => d.key !== \"ui-ssr\" && !d.key.startsWith(\"plugin:\"),\n );\n\n const allLocal = descriptors.every((d) => d.source === \"local\");\n const hasProxy = [...map.values()].some((d) => d.proxy && d.source === \"local\");\n if (allLocal && !hasProxy) return \"Full Local Development\";\n\n const parts: string[] = [];\n for (const d of descriptors) {\n if (d.source === \"remote\") {\n const label =\n d.key === \"host\"\n ? \"Remote Host\"\n : d.key === \"ui\"\n ? \"Remote UI\"\n : d.key === \"api\"\n ? hasProxy\n ? undefined\n : \"Remote API\"\n : d.key === \"auth\"\n ? \"Remote Auth\"\n : undefined;\n if (label) parts.push(label);\n }\n }\n if (hasProxy) parts.push(\"Proxy API → Production\");\n return parts.join(\" + \") || \"Remote Mode\";\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service-descriptor.cjs","names":["Context","Layer","existsSync","path"],"sources":["../src/service-descriptor.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Context, Layer } from \"effect\";\nimport type { JsonObject, RuntimeConfig, SourceMode } from \"./types\";\n\nexport interface AuthSlotShape {\n source: string;\n localPath?: string;\n url?: string;\n}\n\n/**\n * True when a `plugins.<id>` entry is the runtime-config mirror of the\n * app-slot auth plugin (same backend target) — the `auth` service already\n * spawns that backend, so the mirror contributes only its `ui` surface.\n * The single implementation; consumed by the service descriptors, the DAG,\n * the infra planner, and the dev session.\n */\nexport function isAuthMirrorPluginEntry(\n authEntry: AuthSlotShape | undefined,\n pluginId: string,\n pluginConfig: AuthSlotShape,\n): boolean {\n if (pluginId !== \"auth\" || !authEntry) return false;\n if (pluginConfig === authEntry) return true;\n if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;\n if (\n !pluginConfig.localPath &&\n pluginConfig.source === \"remote\" &&\n pluginConfig.url &&\n pluginConfig.url === authEntry.url\n ) {\n return true;\n }\n return false;\n}\n\nexport interface ServiceDescriptor {\n key: string;\n source: SourceMode;\n url: string;\n remoteUrl?: string;\n entry: string;\n name: string;\n localPath?: string;\n port?: number;\n readinessPath: string;\n defaultPort: number;\n integrity?: string;\n proxy?: string;\n variables?: JsonObject;\n secrets?: string[];\n ssr?: boolean;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n readyPatterns?: RegExp[];\n errorPatterns?: RegExp[];\n /** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */\n uiPort?: number;\n}\n\nexport class ServiceDescriptorMap extends Context.Service<\n ServiceDescriptorMap,\n Map<string, ServiceDescriptor>\n>()(\"ServiceDescriptorMap\") {}\n\nexport class DevRuntimeConfig extends Context.Service<DevRuntimeConfig, RuntimeConfig>()(\n \"DevRuntimeConfig\",\n) {}\n\nexport class DevGeneratedEnv extends Context.Service<DevGeneratedEnv, Record<string, string>>()(\n \"DevGeneratedEnv\",\n) {}\n\nexport const DevGeneratedEnvLive = (env: Record<string, string>) =>\n Layer.succeed(DevGeneratedEnv, env);\n\nconst PLUGIN_READY_PATTERNS = [/ready in/i, /compiled.*successfully/i, /listening/i, /started/i];\n\nconst PLUGIN_ERROR_PATTERNS = [\n /\\bERROR in\\b/,\n /failed to compile/i,\n /Module not found/i,\n /Cannot find module/i,\n];\n\nconst SERVICE_CONFIGS = {\n host: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n // The host dev server runs on tsx (TS-capable node), so it can consume\n // framework package sources directly — NODE_OPTIONS makes node's\n // resolver pick the `development` export condition. The env var rides\n // the spawn environment (ADR 0026 §2) and is inherited by the host's\n // tsx children. rsbuild/rspack config loaders must NOT rely on it:\n // their .mjs config evaluation resolves dist (freshness is the\n // prerequisite train's job, ADR 0022).\n env: { NODE_OPTIONS: \"--conditions=development\" },\n readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],\n errorPatterns: [/\\berror\\b(?!s)/i, /\\bfailed to\\b/i, /\\bbuild failed\\b/i, /exception/i],\n defaultPort: 3000,\n readinessPath: \"/health\",\n },\n auth: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3002,\n readinessPath: \"/remoteEntry.js\",\n },\n ui: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bLocal:\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/\\berror\\b(?!s)/i, /\\bfailed to\\b/i, /\\bbuild failed\\b/i],\n defaultPort: 3003,\n readinessPath: \"/remoteEntry.js\",\n },\n api: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3001,\n readinessPath: \"/remoteEntry.js\",\n },\n} as const satisfies Record<\n string,\n Pick<\n ServiceDescriptor,\n \"command\" | \"args\" | \"env\" | \"readyPatterns\" | \"errorPatterns\" | \"defaultPort\" | \"readinessPath\"\n >\n>;\n\nexport function buildServiceDescriptorMap(\n runtimeConfig: RuntimeConfig,\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n const map = new Map<string, ServiceDescriptor>();\n const ssr = options?.ssr ?? false;\n\n const hostIsRemote = runtimeConfig.host.source === \"remote\";\n const hostProbeUrl = hostIsRemote\n ? (runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url)\n : runtimeConfig.host.url;\n map.set(\"host\", {\n key: \"host\",\n source: runtimeConfig.host.source,\n url: hostProbeUrl,\n remoteUrl: runtimeConfig.host.remoteUrl,\n entry: hostIsRemote\n ? hostProbeUrl\n ? `${hostProbeUrl}/mf-manifest.json`\n : \"/mf-manifest.json\"\n : runtimeConfig.host.entry,\n name: runtimeConfig.host.name,\n localPath: runtimeConfig.host.localPath,\n port: runtimeConfig.host.port,\n integrity: runtimeConfig.host.integrity,\n secrets: runtimeConfig.host.secrets,\n ...SERVICE_CONFIGS.host,\n });\n\n map.set(\"ui\", {\n key: \"ui\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.url,\n remoteUrl: runtimeConfig.ui.source === \"remote\" ? runtimeConfig.ui.url : undefined,\n entry: runtimeConfig.ui.entry,\n name: runtimeConfig.ui.name,\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.port,\n integrity: runtimeConfig.ui.integrity,\n ssr,\n ...SERVICE_CONFIGS.ui,\n env: { BOS_DEV_SERVER: \"1\" },\n // BOS_NO_WATCH stacks (regression/CI) build once and serve the built dist\n // via rsbuild preview — no watcher, no HMR.\n args: process.env.BOS_NO_WATCH === \"1\" ? [\"run\", \"dev:built\"] : SERVICE_CONFIGS.ui.args,\n });\n\n map.set(\"api\", {\n key: \"api\",\n source: runtimeConfig.api.source,\n url: runtimeConfig.api.url,\n remoteUrl: runtimeConfig.api.source === \"remote\" ? runtimeConfig.api.url : undefined,\n entry: runtimeConfig.api.entry,\n name: runtimeConfig.api.name,\n localPath: runtimeConfig.api.localPath,\n port: runtimeConfig.api.port,\n integrity: runtimeConfig.api.integrity,\n proxy: runtimeConfig.api.proxy,\n variables: runtimeConfig.api.variables,\n secrets: runtimeConfig.api.secrets,\n ...SERVICE_CONFIGS.api,\n });\n\n if (runtimeConfig.auth) {\n map.set(\"auth\", {\n key: \"auth\",\n source: runtimeConfig.auth.source,\n url: runtimeConfig.auth.url,\n remoteUrl: runtimeConfig.auth.source === \"remote\" ? runtimeConfig.auth.url : undefined,\n entry: runtimeConfig.auth.entry,\n name: runtimeConfig.auth.name,\n localPath: runtimeConfig.auth.localPath,\n port: runtimeConfig.auth.port,\n integrity: runtimeConfig.auth.integrity,\n proxy: runtimeConfig.auth.proxy,\n variables: runtimeConfig.auth.variables,\n secrets: runtimeConfig.auth.secrets,\n ...SERVICE_CONFIGS.auth,\n });\n }\n\n if (runtimeConfig.plugins) {\n let pluginBasePort = 3010;\n for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {\n const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);\n const pluginKey = `plugin:${pluginId}`;\n const resolvedPort = pluginConfig.port ?? pluginBasePort;\n pluginBasePort = resolvedPort + 1;\n\n // Folder-form ui source: the ui dir lives inside the plugin workspace\n // (no own package.json) — `every-plugin dev` spawns its UI build as a\n // child (BOS_UI_PORT), so no separate plugin-ui service is spawned.\n const uiLocalPath = pluginConfig.ui?.localPath;\n const isFolderFormUi = Boolean(\n uiLocalPath &&\n pluginConfig.ui?.source === \"local\" &&\n existsSync(path.join(uiLocalPath, \"src\", \"routes\")) &&\n !existsSync(path.join(uiLocalPath, \"package.json\")),\n );\n const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;\n if (isFolderFormUi) pluginBasePort = folderUiPort + 1;\n\n if (!isAuthMirror) {\n map.set(pluginKey, {\n key: pluginKey,\n source: pluginConfig.source,\n url: pluginConfig.url,\n remoteUrl: pluginConfig.source === \"remote\" ? pluginConfig.url : undefined,\n entry: pluginConfig.entry,\n name: pluginConfig.name,\n localPath: pluginConfig.localPath,\n port: resolvedPort,\n integrity: pluginConfig.integrity,\n proxy: pluginConfig.proxy,\n variables: pluginConfig.variables,\n secrets: pluginConfig.secrets,\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : undefined,\n uiPort: isFolderFormUi ? folderUiPort : undefined,\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: resolvedPort,\n readinessPath: \"/remoteEntry.js\",\n });\n } else if (isFolderFormUi) {\n // Folder-form ui for the auth mirror: the `auth` app slot owns the\n // dev process (plugin:auth is not spawned), so BOS_UI_PORT rides on\n // the auth descriptor. folderUiPort is the same port the runtime\n // config wired into the mirror's ui.url (withLocalRuntimeUrl).\n const authDescriptor = map.get(\"auth\");\n if (authDescriptor) {\n map.set(\"auth\", {\n ...authDescriptor,\n env: { BOS_UI_PORT: String(folderUiPort) },\n uiPort: folderUiPort,\n });\n }\n }\n\n if (pluginConfig.ui?.localPath && pluginConfig.ui.source === \"local\" && !isFolderFormUi) {\n const uiKey = `plugin-ui:${pluginId}`;\n const uiPort = pluginConfig.ui.port ?? pluginBasePort;\n pluginBasePort = uiPort + 1;\n\n map.set(uiKey, {\n key: uiKey,\n source: pluginConfig.ui.source,\n url: pluginConfig.ui.url,\n entry: pluginConfig.ui.entry,\n name: pluginConfig.ui.name,\n localPath: pluginConfig.ui.localPath,\n port: uiPort,\n integrity: pluginConfig.ui.integrity,\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: uiPort,\n readinessPath: \"/remoteEntry.js\",\n });\n }\n }\n }\n\n return map;\n}\n\nexport interface AppOrchestrator {\n packages: string[];\n description: string;\n env: Record<string, string>;\n port?: number;\n interactive?: boolean;\n noLogs?: boolean;\n}\n\nexport const ServiceDescriptorMapLive = (map: Map<string, ServiceDescriptor>) =>\n Layer.succeed(ServiceDescriptorMap, map);\n\nexport const DevRuntimeConfigLive = (config: RuntimeConfig) =>\n Layer.succeed(DevRuntimeConfig, config);\n\nexport function buildServiceDescriptorMapFromPlan(\n plan: {\n runtimeConfig: RuntimeConfig;\n resolvedPorts: { host?: number; api?: number; auth?: number; ui?: number; uiSsr?: number };\n },\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n return buildServiceDescriptorMap(plan.runtimeConfig, options);\n}\n\ninterface ServiceDescriptorInfo {\n key: string;\n source: string;\n proxy?: string;\n}\n\nexport function buildDescription(map: Map<string, ServiceDescriptorInfo>): string {\n const descriptors = [...map.values()].filter((d) => !d.key.startsWith(\"plugin:\"));\n\n const allLocal = descriptors.every((d) => d.source === \"local\");\n const hasProxy = [...map.values()].some((d) => d.proxy && d.source === \"local\");\n if (allLocal && !hasProxy) return \"Full Local Development\";\n\n const parts: string[] = [];\n for (const d of descriptors) {\n if (d.source === \"remote\") {\n const label =\n d.key === \"host\"\n ? \"Remote Host\"\n : d.key === \"ui\"\n ? \"Remote UI\"\n : d.key === \"api\"\n ? hasProxy\n ? undefined\n : \"Remote API\"\n : d.key === \"auth\"\n ? \"Remote Auth\"\n : undefined;\n if (label) parts.push(label);\n }\n }\n if (hasProxy) parts.push(\"Proxy API → Production\");\n return parts.join(\" + \") || \"Remote Mode\";\n}\n"],"mappings":"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"}