everything-dev 1.53.2 → 2.0.0-rc.1

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 +627 -199
  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 +616 -197
  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
@@ -1,5 +1,5 @@
1
1
  import { JsonObject, SourceMode } from "./types.cjs";
2
- import "effect";
2
+ import { Context, Layer } from "effect";
3
3
  //#region src/service-descriptor.d.ts
4
4
  interface ServiceDescriptor {
5
5
  key: string;
@@ -19,8 +19,11 @@ interface ServiceDescriptor {
19
19
  ssr?: boolean;
20
20
  command?: string;
21
21
  args?: string[];
22
+ env?: Record<string, string>;
22
23
  readyPatterns?: RegExp[];
23
24
  errorPatterns?: RegExp[];
25
+ /** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */
26
+ uiPort?: number;
24
27
  }
25
28
  interface AppOrchestrator {
26
29
  packages: string[];
@@ -19,8 +19,11 @@ interface ServiceDescriptor {
19
19
  ssr?: boolean;
20
20
  command?: string;
21
21
  args?: string[];
22
+ env?: Record<string, string>;
22
23
  readyPatterns?: RegExp[];
23
24
  errorPatterns?: RegExp[];
25
+ /** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */
26
+ uiPort?: number;
24
27
  }
25
28
  interface AppOrchestrator {
26
29
  packages: string[];
@@ -1,30 +1,55 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
1
3
  import { Context, Layer } from "effect";
2
4
 
3
5
  //#region src/service-descriptor.ts
4
- var ServiceDescriptorMap = class extends Context.Tag("ServiceDescriptorMap")() {};
5
- var DevRuntimeConfig = class extends Context.Tag("DevRuntimeConfig")() {};
6
+ /**
7
+ * True when a `plugins.<id>` entry is the runtime-config mirror of the
8
+ * app-slot auth plugin (same backend target) — the `auth` service already
9
+ * spawns that backend, so the mirror contributes only its `ui` surface.
10
+ * The single implementation; consumed by the service descriptors, the DAG,
11
+ * the infra planner, and the dev session.
12
+ */
13
+ function isAuthMirrorPluginEntry(authEntry, pluginId, pluginConfig) {
14
+ if (pluginId !== "auth" || !authEntry) return false;
15
+ if (pluginConfig === authEntry) return true;
16
+ if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;
17
+ if (!pluginConfig.localPath && pluginConfig.source === "remote" && pluginConfig.url && pluginConfig.url === authEntry.url) return true;
18
+ return false;
19
+ }
20
+ var ServiceDescriptorMap = class extends Context.Service()("ServiceDescriptorMap") {};
21
+ var DevRuntimeConfig = class extends Context.Service()("DevRuntimeConfig") {};
22
+ var DevGeneratedEnv = class extends Context.Service()("DevGeneratedEnv") {};
23
+ const DevGeneratedEnvLive = (env) => Layer.succeed(DevGeneratedEnv, env);
6
24
  const PLUGIN_READY_PATTERNS = [
7
25
  /ready in/i,
8
26
  /compiled.*successfully/i,
9
27
  /listening/i,
10
28
  /started/i
11
29
  ];
12
- const PLUGIN_ERROR_PATTERNS = [/error/i, /failed/i];
30
+ const PLUGIN_ERROR_PATTERNS = [
31
+ /\bERROR in\b/,
32
+ /failed to compile/i,
33
+ /Module not found/i,
34
+ /Cannot find module/i
35
+ ];
13
36
  const SERVICE_CONFIGS = {
14
37
  host: {
15
- command: "bun",
38
+ command: "pnpm",
16
39
  args: ["run", "dev"],
40
+ env: { NODE_OPTIONS: "--conditions=development" },
17
41
  readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],
18
42
  errorPatterns: [
19
- /error:/i,
20
- /failed/i,
43
+ /\berror\b(?!s)/i,
44
+ /\bfailed to\b/i,
45
+ /\bbuild failed\b/i,
21
46
  /exception/i
22
47
  ],
23
48
  defaultPort: 3e3,
24
49
  readinessPath: "/health"
25
50
  },
26
51
  auth: {
27
- command: "bun",
52
+ command: "pnpm",
28
53
  args: ["run", "dev"],
29
54
  readyPatterns: PLUGIN_READY_PATTERNS,
30
55
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -32,27 +57,23 @@ const SERVICE_CONFIGS = {
32
57
  readinessPath: "/remoteEntry.js"
33
58
  },
34
59
  ui: {
35
- command: "bun",
60
+ command: "pnpm",
36
61
  args: ["run", "dev"],
37
62
  readyPatterns: [
38
63
  /\bready\s+built in\b/i,
39
64
  /\bLocal:\b/i,
40
65
  /\bcompiled\b.*successfully/i
41
66
  ],
42
- errorPatterns: [/error/i, /failed to compile/i],
67
+ errorPatterns: [
68
+ /\berror\b(?!s)/i,
69
+ /\bfailed to\b/i,
70
+ /\bbuild failed\b/i
71
+ ],
43
72
  defaultPort: 3003,
44
73
  readinessPath: "/remoteEntry.js"
45
74
  },
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
75
  api: {
55
- command: "bun",
76
+ command: "pnpm",
56
77
  args: ["run", "dev"],
57
78
  readyPatterns: PLUGIN_READY_PATTERNS,
58
79
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -89,17 +110,9 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
89
110
  port: runtimeConfig.ui.port,
90
111
  integrity: runtimeConfig.ui.integrity,
91
112
  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"]
113
+ ...SERVICE_CONFIGS.ui,
114
+ env: { BOS_DEV_SERVER: "1" },
115
+ args: process.env.BOS_NO_WATCH === "1" ? ["run", "dev:built"] : SERVICE_CONFIGS.ui.args
103
116
  });
104
117
  map.set("api", {
105
118
  key: "api",
@@ -134,10 +147,15 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
134
147
  if (runtimeConfig.plugins) {
135
148
  let pluginBasePort = 3010;
136
149
  for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {
150
+ const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);
137
151
  const pluginKey = `plugin:${pluginId}`;
138
152
  const resolvedPort = pluginConfig.port ?? pluginBasePort;
139
153
  pluginBasePort = resolvedPort + 1;
140
- map.set(pluginKey, {
154
+ const uiLocalPath = pluginConfig.ui?.localPath;
155
+ const isFolderFormUi = Boolean(uiLocalPath && pluginConfig.ui?.source === "local" && existsSync(path.join(uiLocalPath, "src", "routes")) && !existsSync(path.join(uiLocalPath, "package.json")));
156
+ const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;
157
+ if (isFolderFormUi) pluginBasePort = folderUiPort + 1;
158
+ if (!isAuthMirror) map.set(pluginKey, {
141
159
  key: pluginKey,
142
160
  source: pluginConfig.source,
143
161
  url: pluginConfig.url,
@@ -150,14 +168,24 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
150
168
  proxy: pluginConfig.proxy,
151
169
  variables: pluginConfig.variables,
152
170
  secrets: pluginConfig.secrets,
153
- command: "bun",
171
+ command: "pnpm",
154
172
  args: ["run", "dev"],
173
+ env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : void 0,
174
+ uiPort: isFolderFormUi ? folderUiPort : void 0,
155
175
  readyPatterns: PLUGIN_READY_PATTERNS,
156
176
  errorPatterns: PLUGIN_ERROR_PATTERNS,
157
177
  defaultPort: resolvedPort,
158
178
  readinessPath: "/remoteEntry.js"
159
179
  });
160
- if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local") {
180
+ else if (isFolderFormUi) {
181
+ const authDescriptor = map.get("auth");
182
+ if (authDescriptor) map.set("auth", {
183
+ ...authDescriptor,
184
+ env: { BOS_UI_PORT: String(folderUiPort) },
185
+ uiPort: folderUiPort
186
+ });
187
+ }
188
+ if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local" && !isFolderFormUi) {
161
189
  const uiKey = `plugin-ui:${pluginId}`;
162
190
  const uiPort = pluginConfig.ui.port ?? pluginBasePort;
163
191
  pluginBasePort = uiPort + 1;
@@ -170,7 +198,7 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
170
198
  localPath: pluginConfig.ui.localPath,
171
199
  port: uiPort,
172
200
  integrity: pluginConfig.ui.integrity,
173
- command: "bun",
201
+ command: "pnpm",
174
202
  args: ["run", "dev"],
175
203
  readyPatterns: PLUGIN_READY_PATTERNS,
176
204
  errorPatterns: PLUGIN_ERROR_PATTERNS,
@@ -188,7 +216,7 @@ function buildServiceDescriptorMapFromPlan(plan, options) {
188
216
  return buildServiceDescriptorMap(plan.runtimeConfig, options);
189
217
  }
190
218
  function buildDescription(map) {
191
- const descriptors = [...map.values()].filter((d) => d.key !== "ui-ssr" && !d.key.startsWith("plugin:"));
219
+ const descriptors = [...map.values()].filter((d) => !d.key.startsWith("plugin:"));
192
220
  const allLocal = descriptors.every((d) => d.source === "local");
193
221
  const hasProxy = [...map.values()].some((d) => d.proxy && d.source === "local");
194
222
  if (allLocal && !hasProxy) return "Full Local Development";
@@ -202,5 +230,5 @@ function buildDescription(map) {
202
230
  }
203
231
 
204
232
  //#endregion
205
- export { DevRuntimeConfig, DevRuntimeConfigLive, ServiceDescriptorMap, ServiceDescriptorMapLive, buildDescription, buildServiceDescriptorMap, buildServiceDescriptorMapFromPlan };
233
+ export { DevGeneratedEnv, DevGeneratedEnvLive, DevRuntimeConfig, DevRuntimeConfigLive, ServiceDescriptorMap, ServiceDescriptorMapLive, buildDescription, buildServiceDescriptorMap, buildServiceDescriptorMapFromPlan, isAuthMirrorPluginEntry };
206
234
  //# sourceMappingURL=service-descriptor.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-descriptor.mjs","names":[],"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.mjs","names":[],"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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"}
@@ -1,10 +1,19 @@
1
1
  const require_merge = require('./merge.cjs');
2
2
  const require_types = require('./types.cjs');
3
+ const require_config = require('./config.cjs');
4
+ const require_workspace_catalog = require('./workspace-catalog.cjs');
5
+ const require_workspace = require('./workspace.cjs');
3
6
  let node_fs = require("node:fs");
4
7
  let node_path = require("node:path");
5
8
  let node_crypto = require("node:crypto");
6
9
 
7
10
  //#region src/shared-deps.ts
11
+ async function loadBosConfigForSharedDeps(configDir, bosConfigPath) {
12
+ const appDescriptorPath = (0, node_path.join)(configDir, "bos.app.ts");
13
+ if ((0, node_fs.existsSync)(appDescriptorPath)) return require_config.loadAppDescriptorConfig(appDescriptorPath);
14
+ if ((0, node_fs.existsSync)(bosConfigPath)) return JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
15
+ return JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
16
+ }
8
17
  function sha256(input) {
9
18
  return (0, node_crypto.createHash)("sha256").update(input).digest("hex");
10
19
  }
@@ -98,16 +107,15 @@ function collectSharedDepRefs(bosConfig) {
98
107
  async function syncResolvedSharedDeps(opts) {
99
108
  const bosConfigPath = (0, node_path.join)(opts.configDir, "bos.config.json");
100
109
  const resolvedConfigPath = (0, node_path.join)(opts.configDir, ".bos", "bos.resolved-config.json");
101
- const packageJsonPath = (0, node_path.join)(opts.configDir, "package.json");
110
+ const workspaceRoot = require_workspace.findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;
102
111
  const generatedPath = (0, node_path.join)(opts.configDir, ".bos", "generated", "shared-deps.json");
103
- const bosConfig = opts.bosConfig ?? JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
104
- if (!require_merge.isPlainObject(bosConfig)) throw new Error("bos.config.json must be an object");
105
- const pkgJson = (0, node_fs.existsSync)(packageJsonPath) ? JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8")) : {};
112
+ const bosConfig = opts.bosConfig ?? await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath);
113
+ if (!require_merge.isPlainObject(bosConfig)) throw new Error("the authored config must be an object");
106
114
  const originalBos = JSON.stringify(bosConfig);
107
- const originalPkg = JSON.stringify(pkgJson);
115
+ const catalog = require_workspace_catalog.readWorkspaceCatalog(workspaceRoot);
116
+ const originalCatalog = JSON.stringify(catalog);
108
117
  const mode = opts.hostMode === "local" ? "catalog->bos" : "bos->catalog";
109
118
  const refsByName = collectSharedDepRefs(bosConfig);
110
- const catalog = pkgJson.workspaces?.catalog ?? {};
111
119
  const resolvedDeps = {};
112
120
  for (const [name, refs] of Object.entries(refsByName)) {
113
121
  const first = refs[0];
@@ -137,15 +145,8 @@ async function syncResolvedSharedDeps(opts) {
137
145
  sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b))
138
146
  };
139
147
  }
140
- if (!pkgJson.workspaces) pkgJson.workspaces = {
141
- packages: [],
142
- catalog: {}
143
- };
144
- pkgJson.workspaces.catalog = catalog;
145
- const nextBos = JSON.stringify(bosConfig);
146
- const nextPkg = JSON.stringify(pkgJson);
147
- const bosConfigChanged = nextBos !== originalBos;
148
- const catalogChanged = nextPkg !== originalPkg;
148
+ const bosConfigChanged = JSON.stringify(bosConfig) !== originalBos;
149
+ const catalogChanged = JSON.stringify(catalog) !== originalCatalog;
149
150
  if (bosConfigChanged) {
150
151
  const resolvedDir = (0, node_path.dirname)(resolvedConfigPath);
151
152
  if (!(0, node_fs.existsSync)(resolvedDir)) (0, node_fs.mkdirSync)(resolvedDir, { recursive: true });
@@ -161,7 +162,7 @@ async function syncResolvedSharedDeps(opts) {
161
162
  };
162
163
  writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\n`);
163
164
  }
164
- if (catalogChanged) writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`);
165
+ if (catalogChanged) require_workspace_catalog.writeWorkspaceCatalog(workspaceRoot, catalog);
165
166
  const stableResolvedDeps = stableDepsObject(resolvedDeps);
166
167
  const resolved = {
167
168
  deps: stableResolvedDeps,
@@ -1 +1 @@
1
- {"version":3,"file":"shared-deps.cjs","names":["isPlainObject","SharedDepMapSchema","rebuildOrderedConfig"],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\n\ninterface PackageJson {\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown = opts.bosConfig ?? JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"bos.config.json must be an object\");\n }\n\n const pkgJson = existsSync(packageJsonPath)\n ? (JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson)\n : {};\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n const catalog = pkgJson.workspaces?.catalog ?? {};\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n if (!pkgJson.workspaces) {\n pkgJson.workspaces = { packages: [], catalog: {} };\n }\n pkgJson.workspaces.catalog = catalog;\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-deps.cjs","names":["join","existsSync","loadAppDescriptorConfig","readFileSync","createHash","isPlainObject","SharedDepMapSchema","findWorkspaceRoot","readWorkspaceCatalog","dirname","rebuildOrderedConfig"],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadAppDescriptorConfig } from \"./config\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\nimport { findWorkspaceRoot } from \"./workspace\";\nimport { readWorkspaceCatalog, writeWorkspaceCatalog } from \"./workspace-catalog\";\n\nasync function loadBosConfigForSharedDeps(\n configDir: string,\n bosConfigPath: string,\n): Promise<unknown> {\n const appDescriptorPath = join(configDir, \"bos.app.ts\");\n if (existsSync(appDescriptorPath)) {\n return loadAppDescriptorConfig(appDescriptorPath);\n }\n if (existsSync(bosConfigPath)) {\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n }\n\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown =\n opts.bosConfig ?? (await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"the authored config must be an object\");\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const catalog = readWorkspaceCatalog(workspaceRoot);\n const originalCatalog = JSON.stringify(catalog);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = JSON.stringify(catalog) !== originalCatalog;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeWorkspaceCatalog(workspaceRoot, catalog);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
@@ -1,10 +1,19 @@
1
1
  import { isPlainObject, rebuildOrderedConfig } from "./merge.mjs";
2
2
  import { SharedDepMapSchema } from "./types.mjs";
3
+ import { loadAppDescriptorConfig } from "./config.mjs";
4
+ import { readWorkspaceCatalog, writeWorkspaceCatalog } from "./workspace-catalog.mjs";
5
+ import { findWorkspaceRoot } from "./workspace.mjs";
3
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
7
  import { dirname, join } from "node:path";
5
8
  import { createHash } from "node:crypto";
6
9
 
7
10
  //#region src/shared-deps.ts
11
+ async function loadBosConfigForSharedDeps(configDir, bosConfigPath) {
12
+ const appDescriptorPath = join(configDir, "bos.app.ts");
13
+ if (existsSync(appDescriptorPath)) return loadAppDescriptorConfig(appDescriptorPath);
14
+ if (existsSync(bosConfigPath)) return JSON.parse(readFileSync(bosConfigPath, "utf-8"));
15
+ return JSON.parse(readFileSync(bosConfigPath, "utf-8"));
16
+ }
8
17
  function sha256(input) {
9
18
  return createHash("sha256").update(input).digest("hex");
10
19
  }
@@ -98,16 +107,15 @@ function collectSharedDepRefs(bosConfig) {
98
107
  async function syncResolvedSharedDeps(opts) {
99
108
  const bosConfigPath = join(opts.configDir, "bos.config.json");
100
109
  const resolvedConfigPath = join(opts.configDir, ".bos", "bos.resolved-config.json");
101
- const packageJsonPath = join(opts.configDir, "package.json");
110
+ const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;
102
111
  const generatedPath = join(opts.configDir, ".bos", "generated", "shared-deps.json");
103
- const bosConfig = opts.bosConfig ?? JSON.parse(readFileSync(bosConfigPath, "utf-8"));
104
- if (!isPlainObject(bosConfig)) throw new Error("bos.config.json must be an object");
105
- const pkgJson = existsSync(packageJsonPath) ? JSON.parse(readFileSync(packageJsonPath, "utf-8")) : {};
112
+ const bosConfig = opts.bosConfig ?? await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath);
113
+ if (!isPlainObject(bosConfig)) throw new Error("the authored config must be an object");
106
114
  const originalBos = JSON.stringify(bosConfig);
107
- const originalPkg = JSON.stringify(pkgJson);
115
+ const catalog = readWorkspaceCatalog(workspaceRoot);
116
+ const originalCatalog = JSON.stringify(catalog);
108
117
  const mode = opts.hostMode === "local" ? "catalog->bos" : "bos->catalog";
109
118
  const refsByName = collectSharedDepRefs(bosConfig);
110
- const catalog = pkgJson.workspaces?.catalog ?? {};
111
119
  const resolvedDeps = {};
112
120
  for (const [name, refs] of Object.entries(refsByName)) {
113
121
  const first = refs[0];
@@ -137,15 +145,8 @@ async function syncResolvedSharedDeps(opts) {
137
145
  sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b))
138
146
  };
139
147
  }
140
- if (!pkgJson.workspaces) pkgJson.workspaces = {
141
- packages: [],
142
- catalog: {}
143
- };
144
- pkgJson.workspaces.catalog = catalog;
145
- const nextBos = JSON.stringify(bosConfig);
146
- const nextPkg = JSON.stringify(pkgJson);
147
- const bosConfigChanged = nextBos !== originalBos;
148
- const catalogChanged = nextPkg !== originalPkg;
148
+ const bosConfigChanged = JSON.stringify(bosConfig) !== originalBos;
149
+ const catalogChanged = JSON.stringify(catalog) !== originalCatalog;
149
150
  if (bosConfigChanged) {
150
151
  const resolvedDir = dirname(resolvedConfigPath);
151
152
  if (!existsSync(resolvedDir)) mkdirSync(resolvedDir, { recursive: true });
@@ -161,7 +162,7 @@ async function syncResolvedSharedDeps(opts) {
161
162
  };
162
163
  writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\n`);
163
164
  }
164
- if (catalogChanged) writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`);
165
+ if (catalogChanged) writeWorkspaceCatalog(workspaceRoot, catalog);
165
166
  const stableResolvedDeps = stableDepsObject(resolvedDeps);
166
167
  const resolved = {
167
168
  deps: stableResolvedDeps,
@@ -1 +1 @@
1
- {"version":3,"file":"shared-deps.mjs","names":[],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\n\ninterface PackageJson {\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown = opts.bosConfig ?? JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"bos.config.json must be an object\");\n }\n\n const pkgJson = existsSync(packageJsonPath)\n ? (JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson)\n : {};\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n const catalog = pkgJson.workspaces?.catalog ?? {};\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n if (!pkgJson.workspaces) {\n pkgJson.workspaces = { packages: [], catalog: {} };\n }\n pkgJson.workspaces.catalog = catalog;\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":";;;;;;;AAsDA,SAAS,OAAO,OAAuB;CACrC,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK;AACxD;AAEA,SAAS,mBAAmB,OAA+B;CACzD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,MAAM,QAAQ,MAAM,MAAM,mCAAmC;CAC7D,OAAO,QAAQ,MAAM,KAAK;AAC5B;AAEA,SAAS,WAAW,SAAyB;CAC3C,OAAO,IAAI;AACb;AAEA,SAAS,iBACP,MACmC;CACnC,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;CAChE,MAAM,MAAyC,CAAC;CAChD,KAAK,MAAM,OAAO,MAChB,IAAI,OAAO,KAAK;CAElB,OAAO;AACT;AAEA,SAAS,yBAAyB,QAAoD;CACpF,OAAO;EACL,SAAS,OAAO;EAChB,iBAAiB,OAAO,mBAAmB;EAC3C,WAAW,OAAO,aAAa;EAC/B,OAAO,OAAO,SAAS;EACvB,eAAe,OAAO,iBAAiB;EACvC,YAAY,OAAO,cAAc;CACnC;AACF;AAEA,SAAS,UAAU,OAAqD;CACtE,OAAO,cAAc,KAAK,IAAI,QAAQ;AACxC;AAEA,SAAS,iBACP,OACA,QAC6C;CAC7C,IAAI,UAAU,QAAW,OAAO;CAEhC,IAAI,CADW,mBAAmB,UAAU,KAClC,CAAC,CAAC,SACV,MAAM,IAAI,MAAM,oCAAoC,QAAQ;CAE9D,OAAO;AACT;AAEA,SAAS,mBAAmB,UAAkB,aAA8B;CAC1E,IAAI;EAEF,IADgB,aAAa,UAAU,OAC7B,MAAM,aAAa,OAAO;CACtC,QAAQ,CAER;CAEA,cAAc,UAAU,WAAW;CACnC,OAAO;AACT;AAEA,SAAS,oBAAoB,MAAiD;CAC5E,OAAO,OAAO,KAAK,UAAU,iBAAiB,IAAI,CAAC,CAAC;AACtD;AAEA,SAAS,sBAAsB,GAAoB,GAA6B;CAC9E,MAAM,OAAO,yBAAyB,CAAC;CACvC,MAAM,QAAQ,yBAAyB,CAAC;CAExC,OACE,KAAK,YAAY,MAAM,WACvB,KAAK,oBAAoB,MAAM,mBAC/B,KAAK,cAAc,MAAM,aACzB,KAAK,UAAU,MAAM,SACrB,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,eAAe,MAAM;AAE9B;AAEA,SAAS,qBAAqB,WAA6D;CACzF,MAAM,uBAAO,IAAI,IAA4B;CAE7C,MAAM,MAAM,UAAU,UAAU,GAAG;CACnC,MAAM,QAAQ,UAAU,KAAK,EAAE;CAC/B,MAAM,SAAS,UAAU,KAAK,GAAG;CACjC,MAAM,UAAU,UAAU,KAAK,IAAI;CACnC,MAAM,UAAU,UAAU,UAAU,OAAO;CAE3C,IAAI,SAAS,YAAY,OACvB,MAAM,IAAI,MACR,iHACF;CAGF,MAAM,UAAU,QAAgB,WAAwD;EACtF,IAAI,CAAC,QAAQ;EAEb,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,MAAM,GAAG;GACnD,MAAM,WAAW,KAAK,IAAI,IAAI;GAC9B,IAAI,CAAC,UAAU;IACb,KAAK,IAAI,MAAM,CAAC;KAAE;KAAQ;IAAO,CAAC,CAAC;IACnC;GACF;GAEA,IAAI,CAAC,sBAAsB,SAAS,EAAE,CAAE,QAAQ,MAAM,GAAG;IACvD,MAAM,WAAW,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI;IAC5D,MAAM,IAAI,MACR,kCAAkC,KAAK,YAAY,SAAS,OAAO,QACrE;GACF;GAEA,SAAS,KAAK;IAAE;IAAQ;GAAO,CAAC;EAClC;CACF;CAEA,OAAO,WAAW,iBAAiB,QAAQ,QAAQ,gBAAgB,CAAC;CACpE,OAAO,YAAY,iBAAiB,SAAS,QAAQ,iBAAiB,CAAC;CAEvE,KAAK,MAAM,CAAC,UAAU,WAAW,OAAO,QAAQ,WAAW,CAAC,CAAC,GAAG;EAC9D,MAAM,eAAe,UAAU,MAAM;EACrC,IAAI,CAAC,cAAc;EAGnB,MAAM,WAAW,UADC,UAAU,aAAa,GACN,CAAC,EAAE,EAAE;EACxC,IAAI,YAAY,YAAY,UAC1B,MAAM,IAAI,MACR,mDAAmD,SAAS,4EAC9D;EAEF,OACE,WAAW,YACX,iBAAiB,aAAa,QAAQ,WAAW,SAAS,QAAQ,CACpE;CACF;CAEA,OAAO,OAAO,YAAY,IAAI;AAChC;AAEA,eAAsB,uBAAuB,MAMX;CAChC,MAAM,gBAAgB,KAAK,KAAK,WAAW,iBAAiB;CAC5D,MAAM,qBAAqB,KAAK,KAAK,WAAW,QAAQ,0BAA0B;CAClF,MAAM,kBAAkB,KAAK,KAAK,WAAW,cAAc;CAC3D,MAAM,gBAAgB,KAAK,KAAK,WAAW,QAAQ,aAAa,kBAAkB;CAElF,MAAM,YAAqB,KAAK,aAAa,KAAK,MAAM,aAAa,eAAe,OAAO,CAAC;CAC5F,IAAI,CAAC,cAAc,SAAS,GAC1B,MAAM,IAAI,MAAM,mCAAmC;CAGrD,MAAM,UAAU,WAAW,eAAe,IACrC,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC,IAClD,CAAC;CAEL,MAAM,cAAc,KAAK,UAAU,SAAS;CAC5C,MAAM,cAAc,KAAK,UAAU,OAAO;CAE1C,MAAM,OAAO,KAAK,aAAa,UAAU,iBAAiB;CAC1D,MAAM,aAAa,qBAAqB,SAAS;CACjD,MAAM,UAAU,QAAQ,YAAY,WAAW,CAAC;CAEhD,MAAM,eAAkD,CAAC;CAEzD,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,UAAU,GAAG;EACrD,MAAM,QAAQ,KAAK;EACnB,IAAI,CAAC,OAAO;EAEZ,MAAM,kBACJ,mBAAmB,MAAM,OAAO,OAAO,KAAK,mBAAmB,MAAM,OAAO,eAAe;EAC7F,MAAM,mBAAmB,mBAAmB,QAAQ,KAAK;EACzD,MAAM,UACJ,SAAS,iBACJ,oBAAoB,kBACpB,mBAAmB;EAE1B,IAAI,CAAC,SAAS;GACZ,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI;GACvD,MAAM,IAAI,MACR,0DAA0D,KAAK,SAAS,SAC1E;EACF;EAEA,IAAI,SAAS,kBAAkB,qBAAqB,QAAQ,iBAC1D,QAAQ,QAAQ;EAGlB,IAAI,SAAS,kBAAkB,QAAQ,UAAU,SAC/C,QAAQ,QAAQ;EAGlB,KAAK,MAAM,OAAO,MAAM;GACtB,IAAI,OAAO,UAAU;GACrB,IAAI,OAAO,kBAAkB,WAAW,OAAO;GAC/C,IAAI,OAAO,aAAa,IAAI,OAAO,cAAc;EACnD;EAEA,aAAa,QAAQ;GACnB;GACA;GACA,iBAAiB,WAAW,OAAO;GACnC,YAAY,MAAM,OAAO,cAAc;GACvC,WAAW,MAAM,OAAO,aAAa;GACrC,OAAO,MAAM,OAAO,SAAS;GAC7B,eAAe,MAAM,OAAO,iBAAiB;GAC7C,SAAS,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;EAC1E;CACF;CAEA,IAAI,CAAC,QAAQ,YACX,QAAQ,aAAa;EAAE,UAAU,CAAC;EAAG,SAAS,CAAC;CAAE;CAEnD,QAAQ,WAAW,UAAU;CAE7B,MAAM,UAAU,KAAK,UAAU,SAAS;CACxC,MAAM,UAAU,KAAK,UAAU,OAAO;CACtC,MAAM,mBAAmB,YAAY;CACrC,MAAM,iBAAiB,YAAY;CAEnC,IAAI,kBAAkB;EACpB,MAAM,cAAc,QAAQ,kBAAkB;EAC9C,IAAI,CAAC,WAAW,WAAW,GACzB,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;EAG5C,MAAM,UAAU,qBAAqB,SAAS;EAO9C,MAAM,iBAAiB;GACrB,WAAW;IANX,KAAK,KAAK,OAAO;IACjB,6BAAY,IAAI,KAAK,EAAC,CAAC,YAAY;IACnC,cAAc,KAAK,gBAAgB,CAAC;IACpC,QAAQ;GAGM;GACd,GAAG;EACL;EAEA,mBAAmB,oBAAoB,GAAG,KAAK,UAAU,gBAAgB,MAAM,CAAC,EAAE,GAAG;CACvF;CAEA,IAAI,gBACF,mBAAmB,iBAAiB,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,GAAG;CAG7E,MAAM,qBAAqB,iBAAiB,YAAY;CACxD,MAAM,WAA+B;EACnC,MAAM;EACN,mBAAmB,oBAAoB,kBAAkB;CAC3D;CAEA,MAAM,gBAAgB;EACpB,eAAe;EACf,MAAM;EACN,8BAAa,IAAI,KAAK,EAAC,CAAC,YAAY;EACpC,MAAM;EACN,mBAAmB,SAAS;EAC5B,QAAQ;GACN;GACA,UAAU,KAAK;EACjB;CACF;CAEA,IAAI,kBAAiC;CACrC,IAAI;EAEF,kBADa,KAAK,MAAM,aAAa,eAAe,OAAO,CACtC,CAAC,EAAE,qBAAqB;CAC/C,QAAQ,CAER;CAEA,UAAU,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;CACrD,mBAAmB,eAAe,GAAG,KAAK,UAAU,eAAe,MAAM,CAAC,EAAE,GAAG;CAE/E,MAAM,mBAAmB,oBAAoB,cAAc;CAE3D,OAAO;EACL;EACA,UAAU,KAAK;EACf;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"shared-deps.mjs","names":[],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadAppDescriptorConfig } from \"./config\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\nimport { findWorkspaceRoot } from \"./workspace\";\nimport { readWorkspaceCatalog, writeWorkspaceCatalog } from \"./workspace-catalog\";\n\nasync function loadBosConfigForSharedDeps(\n configDir: string,\n bosConfigPath: string,\n): Promise<unknown> {\n const appDescriptorPath = join(configDir, \"bos.app.ts\");\n if (existsSync(appDescriptorPath)) {\n return loadAppDescriptorConfig(appDescriptorPath);\n }\n if (existsSync(bosConfigPath)) {\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n }\n\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown =\n opts.bosConfig ?? (await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"the authored config must be an object\");\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const catalog = readWorkspaceCatalog(workspaceRoot);\n const originalCatalog = JSON.stringify(catalog);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = JSON.stringify(catalog) !== originalCatalog;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeWorkspaceCatalog(workspaceRoot, catalog);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region src/start-config-source.ts
3
+ function resolveStartConfigSource(input, env) {
4
+ if (input.configPath) return { configPath: input.configPath };
5
+ const account = input.account ?? env.BOS_ACCOUNT;
6
+ const domain = input.domain ?? env.BOS_GATEWAY;
7
+ if (account && domain) return { registry: {
8
+ account,
9
+ domain
10
+ } };
11
+ return {};
12
+ }
13
+ /** A registry-fetched start is a real deployment — a localhost origin there is
14
+ * a stray dev leftover. Local starts (explicit --config-path, bare `bos start`)
15
+ * keep the operator's environment: their localhost origin IS the reachable
16
+ * deployment context the in-process host's auth seam reads. */
17
+ function isRegistryStart(source) {
18
+ return source.registry !== void 0;
19
+ }
20
+
21
+ //#endregion
22
+ exports.isRegistryStart = isRegistryStart;
23
+ exports.resolveStartConfigSource = resolveStartConfigSource;
24
+ //# sourceMappingURL=start-config-source.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-config-source.cjs","names":[],"sources":["../src/start-config-source.ts"],"sourcesContent":["/**\n * The `bos start --config` decision: an explicit local config outranks the\n * registry identity (BOS_ACCOUNT/BOS_GATEWAY) — FastKV is fetched only when\n * no local config was given.\n */\n\nexport interface StartConfigSource {\n configPath?: string;\n registry?: { account: string; domain: string };\n}\n\nexport function resolveStartConfigSource(\n input: { configPath?: string; account?: string; domain?: string },\n env: { BOS_ACCOUNT?: string; BOS_GATEWAY?: string },\n): StartConfigSource {\n if (input.configPath) {\n return { configPath: input.configPath };\n }\n const account = input.account ?? env.BOS_ACCOUNT;\n const domain = input.domain ?? env.BOS_GATEWAY;\n if (account && domain) {\n return { registry: { account, domain } };\n }\n return {};\n}\n\n/** A registry-fetched start is a real deployment — a localhost origin there is\n * a stray dev leftover. Local starts (explicit --config-path, bare `bos start`)\n * keep the operator's environment: their localhost origin IS the reachable\n * deployment context the in-process host's auth seam reads. */\nexport function isRegistryStart(source: StartConfigSource): boolean {\n return source.registry !== undefined;\n}\n"],"mappings":";;AAWA,SAAgB,yBACd,OACA,KACmB;CACnB,IAAI,MAAM,YACR,OAAO,EAAE,YAAY,MAAM,WAAW;CAExC,MAAM,UAAU,MAAM,WAAW,IAAI;CACrC,MAAM,SAAS,MAAM,UAAU,IAAI;CACnC,IAAI,WAAW,QACb,OAAO,EAAE,UAAU;EAAE;EAAS;CAAO,EAAE;CAEzC,OAAO,CAAC;AACV;;;;;AAMA,SAAgB,gBAAgB,QAAoC;CAClE,OAAO,OAAO,aAAa;AAC7B"}