everything-dev 1.53.1 → 2.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (713) hide show
  1. package/README.md +2 -11
  2. package/dist/_virtual/_rolldown/runtime.cjs +17 -2
  3. package/dist/_virtual/_rolldown/runtime.mjs +36 -0
  4. package/dist/api/auth-middleware.cjs +161 -0
  5. package/dist/api/auth-middleware.cjs.map +1 -0
  6. package/dist/api/auth-middleware.d.cts +69 -0
  7. package/dist/api/auth-middleware.d.mts +69 -0
  8. package/dist/api/auth-middleware.mjs +160 -0
  9. package/dist/api/auth-middleware.mjs.map +1 -0
  10. package/dist/api-contract.cjs +250 -62
  11. package/dist/api-contract.cjs.map +1 -1
  12. package/dist/api-contract.mjs +246 -65
  13. package/dist/api-contract.mjs.map +1 -1
  14. package/dist/app.cjs +99 -26
  15. package/dist/app.cjs.map +1 -1
  16. package/dist/app.d.cts +3 -0
  17. package/dist/app.d.mts +3 -0
  18. package/dist/app.mjs +100 -27
  19. package/dist/app.mjs.map +1 -1
  20. package/dist/auth-login.cjs +163 -0
  21. package/dist/auth-login.cjs.map +1 -0
  22. package/dist/auth-login.mjs +162 -0
  23. package/dist/auth-login.mjs.map +1 -0
  24. package/dist/auth-session.cjs +64 -0
  25. package/dist/auth-session.cjs.map +1 -0
  26. package/dist/auth-session.mjs +58 -0
  27. package/dist/auth-session.mjs.map +1 -0
  28. package/dist/auth-types-gen.cjs +0 -1
  29. package/dist/auth-types-gen.cjs.map +1 -1
  30. package/dist/build.cjs +37 -173
  31. package/dist/build.cjs.map +1 -1
  32. package/dist/build.mjs +37 -171
  33. package/dist/build.mjs.map +1 -1
  34. package/dist/bundle-cache.cjs +74 -0
  35. package/dist/bundle-cache.cjs.map +1 -0
  36. package/dist/bundle-cache.d.cts +27 -0
  37. package/dist/bundle-cache.d.mts +27 -0
  38. package/dist/bundle-cache.mjs +68 -0
  39. package/dist/bundle-cache.mjs.map +1 -0
  40. package/dist/bundle-fs-resolve.cjs +209 -0
  41. package/dist/bundle-fs-resolve.cjs.map +1 -0
  42. package/dist/bundle-fs-resolve.d.cts +76 -0
  43. package/dist/bundle-fs-resolve.d.mts +76 -0
  44. package/dist/bundle-fs-resolve.mjs +202 -0
  45. package/dist/bundle-fs-resolve.mjs.map +1 -0
  46. package/dist/cdn-deploy.cjs +126 -0
  47. package/dist/cdn-deploy.cjs.map +1 -0
  48. package/dist/cdn-deploy.mjs +124 -0
  49. package/dist/cdn-deploy.mjs.map +1 -0
  50. package/dist/cli/db-doctor.cjs +19 -19
  51. package/dist/cli/db-doctor.cjs.map +1 -1
  52. package/dist/cli/db-doctor.mjs +18 -18
  53. package/dist/cli/db-doctor.mjs.map +1 -1
  54. package/dist/cli/db-repair.cjs +9 -32
  55. package/dist/cli/db-repair.cjs.map +1 -1
  56. package/dist/cli/db-repair.mjs +9 -32
  57. package/dist/cli/db-repair.mjs.map +1 -1
  58. package/dist/cli/framework-version.cjs +7 -3
  59. package/dist/cli/framework-version.cjs.map +1 -1
  60. package/dist/cli/framework-version.mjs +7 -3
  61. package/dist/cli/framework-version.mjs.map +1 -1
  62. package/dist/cli/infra.cjs +159 -251
  63. package/dist/cli/infra.cjs.map +1 -1
  64. package/dist/cli/infra.mjs +154 -242
  65. package/dist/cli/infra.mjs.map +1 -1
  66. package/dist/cli/init.cjs +624 -196
  67. package/dist/cli/init.cjs.map +1 -1
  68. package/dist/cli/init.d.cts +61 -8
  69. package/dist/cli/init.d.mts +61 -8
  70. package/dist/cli/init.mjs +613 -194
  71. package/dist/cli/init.mjs.map +1 -1
  72. package/dist/cli/parse.cjs +8 -7
  73. package/dist/cli/parse.cjs.map +1 -1
  74. package/dist/cli/parse.mjs +9 -7
  75. package/dist/cli/parse.mjs.map +1 -1
  76. package/dist/cli/prompts.cjs +14 -1
  77. package/dist/cli/prompts.cjs.map +1 -1
  78. package/dist/cli/prompts.mjs +14 -1
  79. package/dist/cli/prompts.mjs.map +1 -1
  80. package/dist/cli/prune.cjs +220 -0
  81. package/dist/cli/prune.cjs.map +1 -0
  82. package/dist/cli/prune.mjs +220 -0
  83. package/dist/cli/prune.mjs.map +1 -0
  84. package/dist/cli/snapshot.cjs +2 -1
  85. package/dist/cli/snapshot.cjs.map +1 -1
  86. package/dist/cli/snapshot.mjs +2 -1
  87. package/dist/cli/snapshot.mjs.map +1 -1
  88. package/dist/cli/status.cjs +5 -4
  89. package/dist/cli/status.cjs.map +1 -1
  90. package/dist/cli/status.mjs +6 -5
  91. package/dist/cli/status.mjs.map +1 -1
  92. package/dist/cli/sync.cjs +156 -58
  93. package/dist/cli/sync.cjs.map +1 -1
  94. package/dist/cli/sync.mjs +158 -63
  95. package/dist/cli/sync.mjs.map +1 -1
  96. package/dist/cli/timing.cjs +0 -1
  97. package/dist/cli/timing.cjs.map +1 -1
  98. package/dist/cli/upgrade.cjs +95 -69
  99. package/dist/cli/upgrade.cjs.map +1 -1
  100. package/dist/cli/upgrade.mjs +97 -72
  101. package/dist/cli/upgrade.mjs.map +1 -1
  102. package/dist/cli/utils/helpers.cjs.map +1 -1
  103. package/dist/cli.cjs +320 -72
  104. package/dist/cli.cjs.map +1 -1
  105. package/dist/cli.mjs +316 -68
  106. package/dist/cli.mjs.map +1 -1
  107. package/dist/code-artifacts.cjs +76 -8
  108. package/dist/code-artifacts.cjs.map +1 -1
  109. package/dist/code-artifacts.mjs +76 -10
  110. package/dist/code-artifacts.mjs.map +1 -1
  111. package/dist/commands/build.cjs +65 -0
  112. package/dist/commands/build.cjs.map +1 -0
  113. package/dist/commands/build.mjs +65 -0
  114. package/dist/commands/build.mjs.map +1 -0
  115. package/dist/commands/config.cjs +77 -0
  116. package/dist/commands/config.cjs.map +1 -0
  117. package/dist/commands/config.d.cts +8 -0
  118. package/dist/commands/config.d.mts +8 -0
  119. package/dist/commands/config.mjs +74 -0
  120. package/dist/commands/config.mjs.map +1 -0
  121. package/dist/commands/db.cjs +107 -0
  122. package/dist/commands/db.cjs.map +1 -0
  123. package/dist/commands/db.mjs +107 -0
  124. package/dist/commands/db.mjs.map +1 -0
  125. package/dist/commands/deploy.cjs +336 -0
  126. package/dist/commands/deploy.cjs.map +1 -0
  127. package/dist/commands/deploy.mjs +334 -0
  128. package/dist/commands/deploy.mjs.map +1 -0
  129. package/dist/commands/dev.cjs +75 -0
  130. package/dist/commands/dev.cjs.map +1 -0
  131. package/dist/commands/dev.mjs +73 -0
  132. package/dist/commands/dev.mjs.map +1 -0
  133. package/dist/commands/init.cjs +234 -0
  134. package/dist/commands/init.cjs.map +1 -0
  135. package/dist/commands/init.mjs +231 -0
  136. package/dist/commands/init.mjs.map +1 -0
  137. package/dist/commands/keys.cjs +255 -0
  138. package/dist/commands/keys.cjs.map +1 -0
  139. package/dist/commands/keys.mjs +253 -0
  140. package/dist/commands/keys.mjs.map +1 -0
  141. package/dist/commands/ops.cjs +199 -0
  142. package/dist/commands/ops.cjs.map +1 -0
  143. package/dist/commands/ops.mjs +197 -0
  144. package/dist/commands/ops.mjs.map +1 -0
  145. package/dist/commands/plugins.cjs +211 -0
  146. package/dist/commands/plugins.cjs.map +1 -0
  147. package/dist/commands/plugins.mjs +211 -0
  148. package/dist/commands/plugins.mjs.map +1 -0
  149. package/dist/commands/shared.cjs +8 -0
  150. package/dist/commands/shared.cjs.map +1 -0
  151. package/dist/commands/shared.d.cts +6 -0
  152. package/dist/commands/shared.d.mts +6 -0
  153. package/dist/commands/shared.mjs +8 -0
  154. package/dist/commands/shared.mjs.map +1 -0
  155. package/dist/commands/upgrade.cjs +325 -0
  156. package/dist/commands/upgrade.cjs.map +1 -0
  157. package/dist/commands/upgrade.mjs +323 -0
  158. package/dist/commands/upgrade.mjs.map +1 -0
  159. package/dist/components/dev-render.cjs +340 -0
  160. package/dist/components/dev-render.cjs.map +1 -0
  161. package/dist/components/dev-render.mjs +332 -0
  162. package/dist/components/dev-render.mjs.map +1 -0
  163. package/dist/config.cjs +460 -221
  164. package/dist/config.cjs.map +1 -1
  165. package/dist/config.d.cts +491 -48
  166. package/dist/config.d.mts +491 -48
  167. package/dist/config.mjs +439 -212
  168. package/dist/config.mjs.map +1 -1
  169. package/dist/contract.cjs +327 -50
  170. package/dist/contract.cjs.map +1 -1
  171. package/dist/contract.d.cts +1951 -1062
  172. package/dist/contract.d.mts +1951 -1062
  173. package/dist/contract.meta.cjs +107 -12
  174. package/dist/contract.meta.cjs.map +1 -1
  175. package/dist/contract.meta.d.cts +166 -8
  176. package/dist/contract.meta.d.mts +166 -8
  177. package/dist/contract.meta.mjs +107 -11
  178. package/dist/contract.meta.mjs.map +1 -1
  179. package/dist/contract.mjs +580 -327
  180. package/dist/contract.mjs.map +1 -1
  181. package/dist/dag.cjs +5 -3
  182. package/dist/dag.cjs.map +1 -1
  183. package/dist/dag.mjs +6 -3
  184. package/dist/dag.mjs.map +1 -1
  185. package/dist/db/binding.cjs +80 -0
  186. package/dist/db/binding.cjs.map +1 -0
  187. package/dist/db/binding.d.cts +39 -0
  188. package/dist/db/binding.d.mts +39 -0
  189. package/dist/db/binding.mjs +78 -0
  190. package/dist/db/binding.mjs.map +1 -0
  191. package/dist/db/bindings.cjs +78 -0
  192. package/dist/db/bindings.cjs.map +1 -0
  193. package/dist/db/bindings.d.cts +34 -0
  194. package/dist/db/bindings.d.mts +34 -0
  195. package/dist/db/bindings.mjs +76 -0
  196. package/dist/db/bindings.mjs.map +1 -0
  197. package/dist/db/core.cjs +204 -0
  198. package/dist/db/core.cjs.map +1 -0
  199. package/dist/db/core.d.cts +69 -0
  200. package/dist/db/core.d.mts +69 -0
  201. package/dist/db/core.mjs +192 -0
  202. package/dist/db/core.mjs.map +1 -0
  203. package/dist/db/driver.cjs +167 -0
  204. package/dist/db/driver.cjs.map +1 -0
  205. package/dist/db/driver.d.cts +50 -0
  206. package/dist/db/driver.d.mts +50 -0
  207. package/dist/db/driver.mjs +165 -0
  208. package/dist/db/driver.mjs.map +1 -0
  209. package/dist/db/drizzle-kit.cjs +177 -0
  210. package/dist/db/drizzle-kit.cjs.map +1 -0
  211. package/dist/db/drizzle-kit.d.cts +25 -0
  212. package/dist/db/drizzle-kit.d.mts +25 -0
  213. package/dist/db/drizzle-kit.mjs +175 -0
  214. package/dist/db/drizzle-kit.mjs.map +1 -0
  215. package/dist/db/errors.cjs +27 -0
  216. package/dist/db/errors.cjs.map +1 -0
  217. package/dist/db/errors.d.cts +16 -0
  218. package/dist/db/errors.d.mts +16 -0
  219. package/dist/db/errors.mjs +26 -0
  220. package/dist/db/errors.mjs.map +1 -0
  221. package/dist/db/identity.cjs +55 -0
  222. package/dist/db/identity.cjs.map +1 -0
  223. package/dist/db/identity.d.cts +40 -0
  224. package/dist/db/identity.d.mts +40 -0
  225. package/dist/db/identity.mjs +53 -0
  226. package/dist/db/identity.mjs.map +1 -0
  227. package/dist/db/index.cjs +43 -0
  228. package/dist/db/index.d.cts +9 -0
  229. package/dist/db/index.d.mts +9 -0
  230. package/dist/db/index.mjs +10 -0
  231. package/dist/db/run-migrations.cjs +343 -0
  232. package/dist/db/run-migrations.cjs.map +1 -0
  233. package/dist/db/run-migrations.d.cts +87 -0
  234. package/dist/db/run-migrations.d.mts +87 -0
  235. package/dist/db/run-migrations.mjs +341 -0
  236. package/dist/db/run-migrations.mjs.map +1 -0
  237. package/dist/delegate-signer.cjs +85 -0
  238. package/dist/delegate-signer.cjs.map +1 -0
  239. package/dist/delegate-signer.mjs +84 -0
  240. package/dist/delegate-signer.mjs.map +1 -0
  241. package/dist/deploy-diff.cjs +119 -0
  242. package/dist/deploy-diff.cjs.map +1 -0
  243. package/dist/deploy-diff.mjs +109 -0
  244. package/dist/deploy-diff.mjs.map +1 -0
  245. package/dist/descriptor/constructors.cjs +49 -0
  246. package/dist/descriptor/constructors.cjs.map +1 -0
  247. package/dist/descriptor/constructors.d.cts +27 -0
  248. package/dist/descriptor/constructors.d.mts +27 -0
  249. package/dist/descriptor/constructors.mjs +45 -0
  250. package/dist/descriptor/constructors.mjs.map +1 -0
  251. package/dist/descriptor/index.cjs +24 -0
  252. package/dist/descriptor/index.d.cts +5 -0
  253. package/dist/descriptor/index.d.mts +5 -0
  254. package/dist/descriptor/index.mjs +6 -0
  255. package/dist/descriptor/resolve.cjs +258 -0
  256. package/dist/descriptor/resolve.cjs.map +1 -0
  257. package/dist/descriptor/resolve.d.cts +50 -0
  258. package/dist/descriptor/resolve.d.mts +50 -0
  259. package/dist/descriptor/resolve.mjs +252 -0
  260. package/dist/descriptor/resolve.mjs.map +1 -0
  261. package/dist/descriptor/schema.cjs +109 -0
  262. package/dist/descriptor/schema.cjs.map +1 -0
  263. package/dist/descriptor/schema.d.cts +217 -0
  264. package/dist/descriptor/schema.d.mts +217 -0
  265. package/dist/descriptor/schema.mjs +102 -0
  266. package/dist/descriptor/schema.mjs.map +1 -0
  267. package/dist/descriptor/serialize.cjs +45 -0
  268. package/dist/descriptor/serialize.cjs.map +1 -0
  269. package/dist/descriptor/serialize.d.cts +7 -0
  270. package/dist/descriptor/serialize.d.mts +7 -0
  271. package/dist/descriptor/serialize.mjs +45 -0
  272. package/dist/descriptor/serialize.mjs.map +1 -0
  273. package/dist/dev-log-pipeline.cjs +273 -0
  274. package/dist/dev-log-pipeline.cjs.map +1 -0
  275. package/dist/dev-log-pipeline.mjs +267 -0
  276. package/dist/dev-log-pipeline.mjs.map +1 -0
  277. package/dist/dev-logs.cjs +39 -8
  278. package/dist/dev-logs.cjs.map +1 -1
  279. package/dist/dev-logs.mjs +37 -9
  280. package/dist/dev-logs.mjs.map +1 -1
  281. package/dist/dev-program.cjs +405 -0
  282. package/dist/dev-program.cjs.map +1 -0
  283. package/dist/dev-program.d.cts +10 -0
  284. package/dist/dev-program.d.mts +10 -0
  285. package/dist/dev-program.mjs +395 -0
  286. package/dist/dev-program.mjs.map +1 -0
  287. package/dist/dev-session-data.d.cts +27 -0
  288. package/dist/dev-session-data.d.mts +27 -0
  289. package/dist/dev-session.cjs +178 -105
  290. package/dist/dev-session.cjs.map +1 -1
  291. package/dist/dev-session.mjs +180 -105
  292. package/dist/dev-session.mjs.map +1 -1
  293. package/dist/env/process-env.cjs +16 -0
  294. package/dist/env/process-env.cjs.map +1 -0
  295. package/dist/env/process-env.mjs +13 -0
  296. package/dist/env/process-env.mjs.map +1 -0
  297. package/dist/env/project-env.cjs +144 -0
  298. package/dist/env/project-env.cjs.map +1 -0
  299. package/dist/env/project-env.d.cts +1 -0
  300. package/dist/env/project-env.d.mts +1 -0
  301. package/dist/env/project-env.mjs +132 -0
  302. package/dist/env/project-env.mjs.map +1 -0
  303. package/dist/fastkv.cjs +59 -12
  304. package/dist/fastkv.cjs.map +1 -1
  305. package/dist/fastkv.d.cts +42 -6
  306. package/dist/fastkv.d.mts +42 -6
  307. package/dist/fastkv.mjs +58 -13
  308. package/dist/fastkv.mjs.map +1 -1
  309. package/dist/fingerprint.cjs +57 -0
  310. package/dist/fingerprint.cjs.map +1 -0
  311. package/dist/fingerprint.d.cts +14 -0
  312. package/dist/fingerprint.d.mts +14 -0
  313. package/dist/fingerprint.mjs +55 -0
  314. package/dist/fingerprint.mjs.map +1 -0
  315. package/dist/http-client.cjs +17 -17
  316. package/dist/http-client.cjs.map +1 -1
  317. package/dist/http-client.mjs +17 -17
  318. package/dist/http-client.mjs.map +1 -1
  319. package/dist/image-deploy.cjs +186 -0
  320. package/dist/image-deploy.cjs.map +1 -0
  321. package/dist/image-deploy.mjs +182 -0
  322. package/dist/image-deploy.mjs.map +1 -0
  323. package/dist/index.cjs +66 -18
  324. package/dist/index.d.cts +8 -7
  325. package/dist/index.d.mts +8 -7
  326. package/dist/index.mjs +6 -5
  327. package/dist/infra/docker.cjs +77 -0
  328. package/dist/infra/docker.cjs.map +1 -0
  329. package/dist/infra/docker.d.cts +10 -0
  330. package/dist/infra/docker.d.mts +10 -0
  331. package/dist/infra/docker.mjs +69 -0
  332. package/dist/infra/docker.mjs.map +1 -0
  333. package/dist/infra/materializer.cjs +74 -0
  334. package/dist/infra/materializer.cjs.map +1 -0
  335. package/dist/infra/materializer.mjs +70 -0
  336. package/dist/infra/materializer.mjs.map +1 -0
  337. package/dist/infra/planner.cjs +135 -103
  338. package/dist/infra/planner.cjs.map +1 -1
  339. package/dist/infra/planner.mjs +137 -104
  340. package/dist/infra/planner.mjs.map +1 -1
  341. package/dist/infra/port-ownership.cjs +57 -0
  342. package/dist/infra/port-ownership.cjs.map +1 -0
  343. package/dist/infra/port-ownership.mjs +57 -0
  344. package/dist/infra/port-ownership.mjs.map +1 -0
  345. package/dist/infra/preflight.cjs +45 -33
  346. package/dist/infra/preflight.cjs.map +1 -1
  347. package/dist/infra/preflight.d.cts +1 -0
  348. package/dist/infra/preflight.d.mts +1 -0
  349. package/dist/infra/preflight.mjs +46 -34
  350. package/dist/infra/preflight.mjs.map +1 -1
  351. package/dist/infra/types.cjs.map +1 -1
  352. package/dist/infra/types.d.cts +2 -0
  353. package/dist/infra/types.d.mts +2 -0
  354. package/dist/infra/types.mjs.map +1 -1
  355. package/dist/integrity.cjs +50 -61
  356. package/dist/integrity.cjs.map +1 -1
  357. package/dist/integrity.d.cts +16 -10
  358. package/dist/integrity.d.mts +16 -10
  359. package/dist/integrity.mjs +50 -59
  360. package/dist/integrity.mjs.map +1 -1
  361. package/dist/internal/manifest-normalizer.cjs +8 -2
  362. package/dist/internal/manifest-normalizer.cjs.map +1 -1
  363. package/dist/internal/manifest-normalizer.mjs +9 -3
  364. package/dist/internal/manifest-normalizer.mjs.map +1 -1
  365. package/dist/merge.cjs +19 -1
  366. package/dist/merge.cjs.map +1 -1
  367. package/dist/merge.d.cts +1 -1
  368. package/dist/merge.d.mts +1 -1
  369. package/dist/merge.mjs +19 -2
  370. package/dist/merge.mjs.map +1 -1
  371. package/dist/mf.cjs +190 -3
  372. package/dist/mf.cjs.map +1 -1
  373. package/dist/mf.d.cts +24 -2
  374. package/dist/mf.d.mts +24 -2
  375. package/dist/mf.mjs +189 -4
  376. package/dist/mf.mjs.map +1 -1
  377. package/dist/near-cli.cjs +59 -91
  378. package/dist/near-cli.cjs.map +1 -1
  379. package/dist/near-cli.mjs +58 -90
  380. package/dist/near-cli.mjs.map +1 -1
  381. package/dist/near-signer.cjs +73 -0
  382. package/dist/near-signer.cjs.map +1 -0
  383. package/dist/near-signer.mjs +70 -0
  384. package/dist/near-signer.mjs.map +1 -0
  385. package/dist/network.cjs +0 -1
  386. package/dist/network.cjs.map +1 -1
  387. package/dist/orchestrator.cjs +256 -87
  388. package/dist/orchestrator.cjs.map +1 -1
  389. package/dist/orchestrator.mjs +248 -87
  390. package/dist/orchestrator.mjs.map +1 -1
  391. package/dist/platform-deploy.cjs +81 -0
  392. package/dist/platform-deploy.cjs.map +1 -0
  393. package/dist/platform-deploy.mjs +80 -0
  394. package/dist/platform-deploy.mjs.map +1 -0
  395. package/dist/plugin.cjs +54 -1389
  396. package/dist/plugin.cjs.map +1 -1
  397. package/dist/plugin.d.cts +6 -896
  398. package/dist/plugin.d.mts +6 -896
  399. package/dist/plugin.mjs +53 -1387
  400. package/dist/plugin.mjs.map +1 -1
  401. package/dist/process-kill.cjs +44 -0
  402. package/dist/process-kill.cjs.map +1 -0
  403. package/dist/process-kill.mjs +43 -0
  404. package/dist/process-kill.mjs.map +1 -0
  405. package/dist/process-registry.cjs +64 -9
  406. package/dist/process-registry.cjs.map +1 -1
  407. package/dist/process-registry.mjs +61 -10
  408. package/dist/process-registry.mjs.map +1 -1
  409. package/dist/progress.cjs +45 -0
  410. package/dist/progress.cjs.map +1 -0
  411. package/dist/progress.d.cts +13 -0
  412. package/dist/progress.d.mts +13 -0
  413. package/dist/progress.mjs +42 -0
  414. package/dist/progress.mjs.map +1 -0
  415. package/dist/publish.cjs +513 -79
  416. package/dist/publish.cjs.map +1 -1
  417. package/dist/publish.mjs +515 -82
  418. package/dist/publish.mjs.map +1 -1
  419. package/dist/registry-use.cjs +41 -0
  420. package/dist/registry-use.cjs.map +1 -0
  421. package/dist/registry-use.mjs +40 -0
  422. package/dist/registry-use.mjs.map +1 -0
  423. package/dist/resolution/session.cjs +335 -0
  424. package/dist/resolution/session.cjs.map +1 -0
  425. package/dist/resolution/session.d.cts +105 -0
  426. package/dist/resolution/session.d.mts +105 -0
  427. package/dist/resolution/session.mjs +331 -0
  428. package/dist/resolution/session.mjs.map +1 -0
  429. package/dist/rollback.cjs +131 -0
  430. package/dist/rollback.cjs.map +1 -0
  431. package/dist/rollback.mjs +128 -0
  432. package/dist/rollback.mjs.map +1 -0
  433. package/dist/sdk.cjs +7 -7
  434. package/dist/sdk.d.cts +3 -3
  435. package/dist/sdk.d.mts +3 -3
  436. package/dist/sdk.mjs +2 -2
  437. package/dist/service-descriptor.cjs +67 -34
  438. package/dist/service-descriptor.cjs.map +1 -1
  439. package/dist/service-descriptor.d.cts +4 -1
  440. package/dist/service-descriptor.d.mts +3 -0
  441. package/dist/service-descriptor.mjs +63 -35
  442. package/dist/service-descriptor.mjs.map +1 -1
  443. package/dist/shared-deps.cjs +17 -16
  444. package/dist/shared-deps.cjs.map +1 -1
  445. package/dist/shared-deps.mjs +17 -16
  446. package/dist/shared-deps.mjs.map +1 -1
  447. package/dist/start-config-source.cjs +24 -0
  448. package/dist/start-config-source.cjs.map +1 -0
  449. package/dist/start-config-source.d.cts +29 -0
  450. package/dist/start-config-source.d.mts +29 -0
  451. package/dist/start-config-source.mjs +22 -0
  452. package/dist/start-config-source.mjs.map +1 -0
  453. package/dist/storage-upload.cjs +145 -0
  454. package/dist/storage-upload.cjs.map +1 -0
  455. package/dist/storage-upload.mjs +143 -0
  456. package/dist/storage-upload.mjs.map +1 -0
  457. package/dist/types.cjs +126 -20
  458. package/dist/types.cjs.map +1 -1
  459. package/dist/types.d.cts +867 -585
  460. package/dist/types.d.mts +867 -585
  461. package/dist/types.mjs +307 -208
  462. package/dist/types.mjs.map +1 -1
  463. package/dist/ui/api.cjs +105 -0
  464. package/dist/ui/api.cjs.map +1 -0
  465. package/dist/ui/api.d.cts +31 -0
  466. package/dist/ui/api.d.mts +31 -0
  467. package/dist/ui/api.mjs +99 -0
  468. package/dist/ui/api.mjs.map +1 -0
  469. package/dist/ui/auth-guards.cjs +50 -0
  470. package/dist/ui/auth-guards.cjs.map +1 -0
  471. package/dist/ui/auth-guards.d.cts +39 -0
  472. package/dist/ui/auth-guards.d.mts +39 -0
  473. package/dist/ui/auth-guards.mjs +48 -0
  474. package/dist/ui/auth-guards.mjs.map +1 -0
  475. package/dist/ui/auth.cjs +197 -0
  476. package/dist/ui/auth.cjs.map +1 -0
  477. package/dist/ui/auth.d.cts +56 -0
  478. package/dist/ui/auth.d.mts +56 -0
  479. package/dist/ui/auth.mjs +179 -0
  480. package/dist/ui/auth.mjs.map +1 -0
  481. package/dist/ui/entry.cjs +16 -0
  482. package/dist/ui/entry.cjs.map +1 -0
  483. package/dist/ui/entry.d.cts +12 -0
  484. package/dist/ui/entry.d.mts +12 -0
  485. package/dist/ui/entry.mjs +15 -0
  486. package/dist/ui/entry.mjs.map +1 -0
  487. package/dist/ui/head.cjs +14 -7
  488. package/dist/ui/head.cjs.map +1 -1
  489. package/dist/ui/head.mjs +15 -7
  490. package/dist/ui/head.mjs.map +1 -1
  491. package/dist/ui/hydrate.cjs +265 -0
  492. package/dist/ui/hydrate.cjs.map +1 -0
  493. package/dist/ui/hydrate.d.cts +48 -0
  494. package/dist/ui/hydrate.d.mts +48 -0
  495. package/dist/ui/hydrate.mjs +263 -0
  496. package/dist/ui/hydrate.mjs.map +1 -0
  497. package/dist/ui/i18n.cjs +153 -0
  498. package/dist/ui/i18n.cjs.map +1 -0
  499. package/dist/ui/i18n.d.cts +29 -0
  500. package/dist/ui/i18n.d.mts +29 -0
  501. package/dist/ui/i18n.mjs +140 -0
  502. package/dist/ui/i18n.mjs.map +1 -0
  503. package/dist/ui/index.cjs +19 -1
  504. package/dist/ui/index.d.cts +6 -3
  505. package/dist/ui/index.d.mts +6 -3
  506. package/dist/ui/index.mjs +5 -2
  507. package/dist/ui/locale.cjs +53 -0
  508. package/dist/ui/locale.cjs.map +1 -0
  509. package/dist/ui/locale.d.cts +18 -0
  510. package/dist/ui/locale.d.mts +18 -0
  511. package/dist/ui/locale.mjs +49 -0
  512. package/dist/ui/locale.mjs.map +1 -0
  513. package/dist/ui/manifest/index.cjs +25 -0
  514. package/dist/ui/manifest/index.cjs.map +1 -0
  515. package/dist/ui/manifest/index.d.cts +9 -0
  516. package/dist/ui/manifest/index.d.mts +9 -0
  517. package/dist/ui/manifest/index.mjs +13 -0
  518. package/dist/ui/manifest/index.mjs.map +1 -0
  519. package/dist/ui/manifest-generator.cjs +8 -0
  520. package/dist/ui/manifest-generator.d.cts +1 -0
  521. package/dist/ui/manifest-generator.d.mts +1 -0
  522. package/dist/ui/manifest-generator.mjs +3 -0
  523. package/dist/ui/message-catalogs.cjs +8 -0
  524. package/dist/ui/message-catalogs.cjs.map +1 -0
  525. package/dist/ui/message-catalogs.d.cts +5 -0
  526. package/dist/ui/message-catalogs.d.mts +5 -0
  527. package/dist/ui/message-catalogs.mjs +8 -0
  528. package/dist/ui/message-catalogs.mjs.map +1 -0
  529. package/dist/ui/metadata.cjs +0 -1
  530. package/dist/ui/metadata.cjs.map +1 -1
  531. package/dist/ui/metadata.d.cts +1 -1
  532. package/dist/ui/metadata.d.mts +1 -1
  533. package/dist/ui/plugin-path.cjs +37 -0
  534. package/dist/ui/plugin-path.cjs.map +1 -0
  535. package/dist/ui/plugin-path.d.cts +25 -0
  536. package/dist/ui/plugin-path.d.mts +25 -0
  537. package/dist/ui/plugin-path.mjs +35 -0
  538. package/dist/ui/plugin-path.mjs.map +1 -0
  539. package/dist/ui/router-client.cjs +61 -0
  540. package/dist/ui/router-client.cjs.map +1 -0
  541. package/dist/ui/router-client.d.cts +20 -0
  542. package/dist/ui/router-client.d.mts +20 -0
  543. package/dist/ui/router-client.mjs +60 -0
  544. package/dist/ui/router-client.mjs.map +1 -0
  545. package/dist/ui/router-defaults.cjs +48 -0
  546. package/dist/ui/router-defaults.cjs.map +1 -0
  547. package/dist/ui/router-defaults.d.cts +8 -0
  548. package/dist/ui/router-defaults.d.mts +8 -0
  549. package/dist/ui/router-defaults.mjs +45 -0
  550. package/dist/ui/router-defaults.mjs.map +1 -0
  551. package/dist/ui/router-error.cjs +70 -0
  552. package/dist/ui/router-error.cjs.map +1 -0
  553. package/dist/ui/router-error.d.cts +19 -0
  554. package/dist/ui/router-error.d.mts +19 -0
  555. package/dist/ui/router-error.mjs +69 -0
  556. package/dist/ui/router-error.mjs.map +1 -0
  557. package/dist/ui/router-server.cjs +153 -0
  558. package/dist/ui/router-server.cjs.map +1 -0
  559. package/dist/ui/router-server.d.cts +38 -0
  560. package/dist/ui/router-server.d.mts +38 -0
  561. package/dist/ui/router-server.mjs +152 -0
  562. package/dist/ui/router-server.mjs.map +1 -0
  563. package/dist/ui/router.cjs +4 -16
  564. package/dist/ui/router.cjs.map +1 -1
  565. package/dist/ui/router.mjs +4 -15
  566. package/dist/ui/router.mjs.map +1 -1
  567. package/dist/ui/runtime.cjs +5 -1
  568. package/dist/ui/runtime.cjs.map +1 -1
  569. package/dist/ui/runtime.d.cts +2 -1
  570. package/dist/ui/runtime.d.mts +2 -1
  571. package/dist/ui/runtime.mjs +5 -1
  572. package/dist/ui/runtime.mjs.map +1 -1
  573. package/dist/ui/slot.cjs +34 -0
  574. package/dist/ui/slot.cjs.map +1 -0
  575. package/dist/ui/slot.d.cts +43 -0
  576. package/dist/ui/slot.d.mts +43 -0
  577. package/dist/ui/slot.mjs +34 -0
  578. package/dist/ui/slot.mjs.map +1 -0
  579. package/dist/ui/tenant.cjs +300 -0
  580. package/dist/ui/tenant.cjs.map +1 -0
  581. package/dist/ui/tenant.d.cts +122 -0
  582. package/dist/ui/tenant.d.mts +122 -0
  583. package/dist/ui/tenant.mjs +279 -0
  584. package/dist/ui/tenant.mjs.map +1 -0
  585. package/dist/ui/types.d.cts +32 -2
  586. package/dist/ui/types.d.mts +32 -2
  587. package/dist/ui/version-check.cjs +47 -0
  588. package/dist/ui/version-check.cjs.map +1 -0
  589. package/dist/ui/version-check.d.cts +23 -0
  590. package/dist/ui/version-check.d.mts +23 -0
  591. package/dist/ui/version-check.mjs +46 -0
  592. package/dist/ui/version-check.mjs.map +1 -0
  593. package/dist/utils/banner.cjs +2 -2
  594. package/dist/utils/banner.cjs.map +1 -1
  595. package/dist/utils/banner.mjs +2 -2
  596. package/dist/utils/banner.mjs.map +1 -1
  597. package/dist/utils/linkify.cjs +1 -1
  598. package/dist/utils/linkify.cjs.map +1 -1
  599. package/dist/utils/linkify.mjs +1 -0
  600. package/dist/utils/linkify.mjs.map +1 -1
  601. package/dist/utils/run.cjs +6 -6
  602. package/dist/utils/run.cjs.map +1 -1
  603. package/dist/utils/run.mjs +6 -6
  604. package/dist/utils/run.mjs.map +1 -1
  605. package/dist/utils/save-config.cjs +12 -0
  606. package/dist/utils/save-config.cjs.map +1 -1
  607. package/dist/utils/save-config.mjs +12 -0
  608. package/dist/utils/save-config.mjs.map +1 -1
  609. package/dist/utils/snapshot-hash.cjs +10 -0
  610. package/dist/utils/snapshot-hash.cjs.map +1 -0
  611. package/dist/utils/snapshot-hash.mjs +10 -0
  612. package/dist/utils/snapshot-hash.mjs.map +1 -0
  613. package/dist/utils/string.cjs +0 -1
  614. package/dist/utils/string.cjs.map +1 -1
  615. package/dist/utils/theme.cjs +30 -12
  616. package/dist/utils/theme.cjs.map +1 -1
  617. package/dist/utils/theme.mjs +30 -11
  618. package/dist/utils/theme.mjs.map +1 -1
  619. package/dist/version-manifest-deploy.cjs +50 -0
  620. package/dist/version-manifest-deploy.cjs.map +1 -0
  621. package/dist/version-manifest-deploy.mjs +49 -0
  622. package/dist/version-manifest-deploy.mjs.map +1 -0
  623. package/dist/version-manifest-resolve.cjs +42 -0
  624. package/dist/version-manifest-resolve.cjs.map +1 -0
  625. package/dist/version-manifest-resolve.d.cts +38 -0
  626. package/dist/version-manifest-resolve.d.mts +38 -0
  627. package/dist/version-manifest-resolve.mjs +40 -0
  628. package/dist/version-manifest-resolve.mjs.map +1 -0
  629. package/dist/version-status.cjs +18 -0
  630. package/dist/version-status.cjs.map +1 -0
  631. package/dist/version-status.d.cts +22 -0
  632. package/dist/version-status.d.mts +22 -0
  633. package/dist/version-status.mjs +17 -0
  634. package/dist/version-status.mjs.map +1 -0
  635. package/dist/workspace-catalog.cjs +53 -0
  636. package/dist/workspace-catalog.cjs.map +1 -0
  637. package/dist/workspace-catalog.mjs +51 -0
  638. package/dist/workspace-catalog.mjs.map +1 -0
  639. package/dist/workspace.cjs +237 -0
  640. package/dist/workspace.cjs.map +1 -0
  641. package/dist/workspace.mjs +233 -0
  642. package/dist/workspace.mjs.map +1 -0
  643. package/package.json +179 -27
  644. package/skills/add-a-route/SKILL.md +132 -0
  645. package/skills/api-and-auth/SKILL.md +87 -21
  646. package/skills/api-and-auth/references/middleware.md +1 -1
  647. package/skills/cli-reference/SKILL.md +48 -21
  648. package/skills/code-style/SKILL.md +8 -0
  649. package/skills/dev-workflow/SKILL.md +50 -26
  650. package/skills/extends-config/SKILL.md +31 -19
  651. package/skills/init-upgrade/SKILL.md +29 -16
  652. package/skills/plugin-development/SKILL.md +46 -112
  653. package/skills/plugin-development/references/database.md +82 -0
  654. package/skills/plugin-development/references/request-context.md +67 -0
  655. package/skills/publish-sync/SKILL.md +99 -22
  656. package/skills/registry/SKILL.md +82 -0
  657. package/skills/super-app/SKILL.md +25 -15
  658. package/skills/talk-to-the-app/SKILL.md +138 -0
  659. package/skills/ui-integration/SKILL.md +93 -11
  660. package/dist/cli/db-studio.cjs +0 -131
  661. package/dist/cli/db-studio.cjs.map +0 -1
  662. package/dist/cli/db-studio.mjs +0 -127
  663. package/dist/cli/db-studio.mjs.map +0 -1
  664. package/dist/cli/init.d.cts.map +0 -1
  665. package/dist/cli/init.d.mts.map +0 -1
  666. package/dist/components/dev-view.cjs +0 -309
  667. package/dist/components/dev-view.cjs.map +0 -1
  668. package/dist/components/dev-view.mjs +0 -309
  669. package/dist/components/dev-view.mjs.map +0 -1
  670. package/dist/components/streaming-view.cjs +0 -134
  671. package/dist/components/streaming-view.cjs.map +0 -1
  672. package/dist/components/streaming-view.mjs +0 -132
  673. package/dist/components/streaming-view.mjs.map +0 -1
  674. package/dist/config.d.cts.map +0 -1
  675. package/dist/config.d.mts.map +0 -1
  676. package/dist/contract.d.cts.map +0 -1
  677. package/dist/contract.d.mts.map +0 -1
  678. package/dist/contract.meta.d.cts.map +0 -1
  679. package/dist/contract.meta.d.mts.map +0 -1
  680. package/dist/dag.d.cts.map +0 -1
  681. package/dist/dag.d.mts.map +0 -1
  682. package/dist/db.cjs +0 -81
  683. package/dist/db.cjs.map +0 -1
  684. package/dist/db.d.cts +0 -30
  685. package/dist/db.d.cts.map +0 -1
  686. package/dist/db.d.mts +0 -30
  687. package/dist/db.d.mts.map +0 -1
  688. package/dist/db.mjs +0 -75
  689. package/dist/db.mjs.map +0 -1
  690. package/dist/fastkv.d.cts.map +0 -1
  691. package/dist/fastkv.d.mts.map +0 -1
  692. package/dist/integrity.d.cts.map +0 -1
  693. package/dist/integrity.d.mts.map +0 -1
  694. package/dist/merge.d.cts.map +0 -1
  695. package/dist/merge.d.mts.map +0 -1
  696. package/dist/mf.d.cts.map +0 -1
  697. package/dist/mf.d.mts.map +0 -1
  698. package/dist/plugin.d.cts.map +0 -1
  699. package/dist/plugin.d.mts.map +0 -1
  700. package/dist/service-descriptor.d.cts.map +0 -1
  701. package/dist/service-descriptor.d.mts.map +0 -1
  702. package/dist/types.d.cts.map +0 -1
  703. package/dist/types.d.mts.map +0 -1
  704. package/dist/ui/head.d.cts.map +0 -1
  705. package/dist/ui/head.d.mts.map +0 -1
  706. package/dist/ui/metadata.d.cts.map +0 -1
  707. package/dist/ui/metadata.d.mts.map +0 -1
  708. package/dist/ui/router.d.cts.map +0 -1
  709. package/dist/ui/router.d.mts.map +0 -1
  710. package/dist/ui/runtime.d.cts.map +0 -1
  711. package/dist/ui/runtime.d.mts.map +0 -1
  712. package/dist/ui/types.d.cts.map +0 -1
  713. package/dist/ui/types.d.mts.map +0 -1
@@ -0,0 +1,165 @@
1
+ import { pluginMigrationSlug } from "./core.mjs";
2
+ import { mkdirSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+
5
+ //#region src/db/driver.ts
6
+ /**
7
+ * Resolve a plugin id to its data-schema name on a shared database.
8
+ *
9
+ * Schema names are unconditional `plugin_<slug>` for every workspace on the
10
+ * shared API database. The `pluginId === "api" ? undefined` special case found
11
+ * in older plugin copies is dead code (a plugin is never `api`); api's own
12
+ * tables already live in `plugin_api`.
13
+ */
14
+ function pluginSchemaName(pluginId) {
15
+ return `plugin_${pluginMigrationSlug(pluginId)}`;
16
+ }
17
+ /**
18
+ * Connection-level guardrails. `ALTER DATABASE ... SET` only reaches sessions
19
+ * opened after it runs — pooled connections that already exist never inherit
20
+ * it, so any bound must ride on every connection's startup options. Defaults:
21
+ * a lock wait fails after 10s (unbounded waits wedge the whole pool silently),
22
+ * a session idle inside a transaction is reaped after 30s, and statement
23
+ * timeout stays off unless DB_STATEMENT_TIMEOUT_MS is set (long migrations and
24
+ * analytical queries must not break).
25
+ */
26
+ /**
27
+ * Parses a millisecond env value for a Postgres `-c` timeout setting.
28
+ * A explicit `0` disables the timeout (Postgres semantics); garbage throws —
29
+ * a typo must fail the boot loudly, never silently become the default.
30
+ */
31
+ function timeoutMsEnv(name, fallbackMs) {
32
+ const raw = process.env[name];
33
+ if (raw === void 0 || raw.trim() === "") return fallbackMs;
34
+ const parsed = Number(raw);
35
+ if (!Number.isFinite(parsed) || parsed < 0) throw new Error(`[db] Invalid ${name}="${raw}" — must be a non-negative number of milliseconds (0 disables the timeout).`);
36
+ return parsed;
37
+ }
38
+ function connectionOptions(namespace) {
39
+ return [
40
+ ...namespace ? [`-c search_path="${namespace}",public`] : [],
41
+ `-c lock_timeout=${timeoutMsEnv("DB_LOCK_TIMEOUT_MS", 1e4)}`,
42
+ `-c idle_in_transaction_session_timeout=${timeoutMsEnv("DB_IDLE_TX_TIMEOUT_MS", 3e4)}`,
43
+ ...process.env.DB_STATEMENT_TIMEOUT_MS ? [`-c statement_timeout=${timeoutMsEnv("DB_STATEMENT_TIMEOUT_MS", 0)}`] : []
44
+ ].join(" ");
45
+ }
46
+ const isLocalDbUrl = (url) => url.includes("localhost") || url.includes("127.0.0.1") || url.includes("host.docker.internal") || url.includes(".railway.internal");
47
+ /**
48
+ * TLS behavior for a non-local Postgres URL, following libpq `sslmode`
49
+ * semantics from the connection string itself:
50
+ *
51
+ * - `disable` → no TLS
52
+ * - `prefer`/`allow`/`require` → TLS, but the server's certificate is NOT
53
+ * verified (libpq: `require` encrypts, it does not trust). Managed
54
+ * providers (Railway, Neon, Supabase poolers…) hand out `sslmode=require`
55
+ * URLs backed by certificates no client CA bundle can verify.
56
+ * - `verify-ca`/`verify-full` → TLS + certificate verification.
57
+ * - absent → verification ON (secure default for bare URLs).
58
+ *
59
+ * `DB_SSL_REJECT_UNAUTHORIZED` stays as an explicit operator override: it
60
+ * wins over whatever the URL says (`"false"` disables verification, `"true"`
61
+ * forces it).
62
+ */
63
+ function resolvePoolSsl(url) {
64
+ if (isLocalDbUrl(url)) return false;
65
+ let mode = null;
66
+ try {
67
+ mode = new URL(url).searchParams.get("sslmode");
68
+ } catch {
69
+ mode = null;
70
+ }
71
+ if (process.env.DB_SSL_REJECT_UNAUTHORIZED === "false") return { rejectUnauthorized: false };
72
+ if (process.env.DB_SSL_REJECT_UNAUTHORIZED === "true") return { rejectUnauthorized: true };
73
+ switch (mode) {
74
+ case "disable": return false;
75
+ case "verify-ca":
76
+ case "verify-full": return { rejectUnauthorized: true };
77
+ case "prefer":
78
+ case "allow":
79
+ case "require": return { rejectUnauthorized: false };
80
+ default: return { rejectUnauthorized: true };
81
+ }
82
+ }
83
+ function buildPoolConfig(url, namespace) {
84
+ return {
85
+ connectionString: url,
86
+ ssl: resolvePoolSsl(url),
87
+ max: Number(process.env.DB_POOL_MAX) || 10,
88
+ connectionTimeoutMillis: Number(process.env.DB_CONNECTION_TIMEOUT_MS) || 3e4,
89
+ idleTimeoutMillis: Number(process.env.DB_IDLE_TIMEOUT_MS) || 3e4,
90
+ options: connectionOptions(namespace)
91
+ };
92
+ }
93
+ async function ensureNamespaceExists(pool, namespace) {
94
+ const client = await pool.connect();
95
+ try {
96
+ await client.query("BEGIN");
97
+ try {
98
+ await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", ["drizzle.__drizzle_migrations"]);
99
+ await client.query(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
100
+ await client.query("COMMIT");
101
+ } catch (error) {
102
+ await client.query("ROLLBACK");
103
+ throw error;
104
+ }
105
+ } finally {
106
+ client.release();
107
+ }
108
+ }
109
+ function createCloseHandler(pool) {
110
+ let closed = false;
111
+ return async () => {
112
+ if (closed) return;
113
+ closed = true;
114
+ pool.removeAllListeners("error");
115
+ pool.removeAllListeners("connect");
116
+ await pool.end();
117
+ };
118
+ }
119
+ /**
120
+ * Create a drizzle database driver for a plugin, choosing the engine by URL
121
+ * scheme: `pglite:` / `:memory:` → embedded PGlite, anything else → postgres
122
+ * (`pg.Pool`).
123
+ *
124
+ * Drivers stay externalized (never statically imported, never in the Module
125
+ * Federation singleton share set) — they are loaded here via dynamic `import()`
126
+ * only, and `drizzle-orm` appears as a runtime import for the `drizzle` entry
127
+ * points. The `namespace` option expresses every topology the platform needs:
128
+ * `plugin_<slug>` on a shared database, undefined for public-schema (api) or
129
+ * dedicated-database (auth) workloads.
130
+ */
131
+ async function createDatabaseDriver(url, schema, namespace) {
132
+ if (url.startsWith("pglite:") || url === ":memory:") {
133
+ const { drizzle } = await import("drizzle-orm/pglite");
134
+ const { PGlite } = await import("@electric-sql/pglite");
135
+ const rawDir = url === ":memory:" ? ":memory:" : url.replace("pglite:", "");
136
+ const dataDir = rawDir.endsWith("/:memory:") || rawDir === ":memory:" ? "memory://" : rawDir;
137
+ if (dataDir !== "memory://") mkdirSync(dirname(dataDir), { recursive: true });
138
+ const pglite = new PGlite(dataDir);
139
+ if (namespace) {
140
+ await pglite.exec(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
141
+ await pglite.exec(`SET search_path TO "${namespace}", public`);
142
+ }
143
+ return {
144
+ db: drizzle(pglite, { schema }),
145
+ close: async () => {
146
+ await pglite.close();
147
+ }
148
+ };
149
+ }
150
+ const { Pool } = await import("pg");
151
+ const { drizzle } = await import("drizzle-orm/node-postgres");
152
+ const pool = new Pool(buildPoolConfig(url, namespace));
153
+ pool.on("error", (err) => {
154
+ console.error("[Database] Unexpected pool error:", err.message);
155
+ });
156
+ if (namespace) await ensureNamespaceExists(pool, namespace);
157
+ return {
158
+ db: drizzle(pool, { schema }),
159
+ close: createCloseHandler(pool)
160
+ };
161
+ }
162
+
163
+ //#endregion
164
+ export { createDatabaseDriver, pluginSchemaName, resolvePoolSsl };
165
+ //# sourceMappingURL=driver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.mjs","names":[],"sources":["../../src/db/driver.ts"],"sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { PgDatabase, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\nimport { pluginMigrationSlug } from \"./core\";\n\nexport interface DatabaseDriver<TSchema extends Record<string, unknown>> {\n readonly db: PgDatabase<PgQueryResultHKT, TSchema>;\n close(): Promise<void>;\n}\n\n/**\n * Resolve a plugin id to its data-schema name on a shared database.\n *\n * Schema names are unconditional `plugin_<slug>` for every workspace on the\n * shared API database. The `pluginId === \"api\" ? undefined` special case found\n * in older plugin copies is dead code (a plugin is never `api`); api's own\n * tables already live in `plugin_api`.\n */\nexport function pluginSchemaName(pluginId: string): string {\n return `plugin_${pluginMigrationSlug(pluginId)}`;\n}\n\ninterface PoolLike {\n on(event: \"error\", listener: (err: Error) => void): unknown;\n connect(): Promise<{\n query: (sql: string, params?: unknown[]) => Promise<unknown>;\n release: () => void;\n }>;\n removeAllListeners(event?: string | symbol): unknown;\n end(): Promise<void>;\n}\n\n/**\n * Connection-level guardrails. `ALTER DATABASE ... SET` only reaches sessions\n * opened after it runs — pooled connections that already exist never inherit\n * it, so any bound must ride on every connection's startup options. Defaults:\n * a lock wait fails after 10s (unbounded waits wedge the whole pool silently),\n * a session idle inside a transaction is reaped after 30s, and statement\n * timeout stays off unless DB_STATEMENT_TIMEOUT_MS is set (long migrations and\n * analytical queries must not break).\n */\n/**\n * Parses a millisecond env value for a Postgres `-c` timeout setting.\n * A explicit `0` disables the timeout (Postgres semantics); garbage throws —\n * a typo must fail the boot loudly, never silently become the default.\n */\nfunction timeoutMsEnv(name: string, fallbackMs: number): number {\n const raw = process.env[name];\n if (raw === undefined || raw.trim() === \"\") return fallbackMs;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(\n `[db] Invalid ${name}=\"${raw}\" — must be a non-negative number of milliseconds (0 disables the timeout).`,\n );\n }\n return parsed;\n}\n\nfunction connectionOptions(namespace: string | undefined): string {\n const settings = [\n ...(namespace ? [`-c search_path=\"${namespace}\",public`] : []),\n `-c lock_timeout=${timeoutMsEnv(\"DB_LOCK_TIMEOUT_MS\", 10_000)}`,\n `-c idle_in_transaction_session_timeout=${timeoutMsEnv(\"DB_IDLE_TX_TIMEOUT_MS\", 30_000)}`,\n ...(process.env.DB_STATEMENT_TIMEOUT_MS\n ? [`-c statement_timeout=${timeoutMsEnv(\"DB_STATEMENT_TIMEOUT_MS\", 0)}`]\n : []),\n ];\n return settings.join(\" \");\n}\n\n// host.docker.internal is docker-local development networking — the test\n// databases a container reaches through the host gateway, which do not\n// terminate TLS. `*.railway.internal` is Railway private-network traffic\n// (VPC-scoped, no public egress) whose Postgres presents a self-signed\n// certificate chain no client CA bundle can verify.\nconst isLocalDbUrl = (url: string): boolean =>\n url.includes(\"localhost\") ||\n url.includes(\"127.0.0.1\") ||\n url.includes(\"host.docker.internal\") ||\n url.includes(\".railway.internal\");\n\n/**\n * TLS behavior for a non-local Postgres URL, following libpq `sslmode`\n * semantics from the connection string itself:\n *\n * - `disable` → no TLS\n * - `prefer`/`allow`/`require` → TLS, but the server's certificate is NOT\n * verified (libpq: `require` encrypts, it does not trust). Managed\n * providers (Railway, Neon, Supabase poolers…) hand out `sslmode=require`\n * URLs backed by certificates no client CA bundle can verify.\n * - `verify-ca`/`verify-full` → TLS + certificate verification.\n * - absent → verification ON (secure default for bare URLs).\n *\n * `DB_SSL_REJECT_UNAUTHORIZED` stays as an explicit operator override: it\n * wins over whatever the URL says (`\"false\"` disables verification, `\"true\"`\n * forces it).\n */\nexport function resolvePoolSsl(url: string): false | { rejectUnauthorized: boolean } {\n if (isLocalDbUrl(url)) return false;\n\n let mode: string | null = null;\n try {\n mode = new URL(url).searchParams.get(\"sslmode\");\n } catch {\n mode = null;\n }\n\n if (process.env.DB_SSL_REJECT_UNAUTHORIZED === \"false\") return { rejectUnauthorized: false };\n if (process.env.DB_SSL_REJECT_UNAUTHORIZED === \"true\") return { rejectUnauthorized: true };\n\n switch (mode) {\n case \"disable\":\n return false;\n case \"verify-ca\":\n case \"verify-full\":\n return { rejectUnauthorized: true };\n case \"prefer\":\n case \"allow\":\n case \"require\":\n return { rejectUnauthorized: false };\n default:\n return { rejectUnauthorized: true };\n }\n}\n\nfunction buildPoolConfig(url: string, namespace: string | undefined) {\n return {\n connectionString: url,\n ssl: resolvePoolSsl(url),\n max: Number(process.env.DB_POOL_MAX) || 10,\n connectionTimeoutMillis: Number(process.env.DB_CONNECTION_TIMEOUT_MS) || 30_000,\n idleTimeoutMillis: Number(process.env.DB_IDLE_TIMEOUT_MS) || 30_000,\n options: connectionOptions(namespace),\n };\n}\n\nasync function ensureNamespaceExists(pool: PoolLike, namespace: string): Promise<void> {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n try {\n // Same journal-scoped advisory lock the migration runner holds, so this\n // CREATE SCHEMA cannot race a concurrent migration run (the runner also\n // creates the schema inside its locked transaction). Xact-scoped: the\n // lock releases at COMMIT/ROLLBACK or on connection death.\n await client.query(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0))\", [\n \"drizzle.__drizzle_migrations\",\n ]);\n await client.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await client.query(\"COMMIT\");\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n }\n } finally {\n client.release();\n }\n}\n\nfunction createCloseHandler(pool: PoolLike): () => Promise<void> {\n let closed = false;\n return async () => {\n if (closed) return;\n closed = true;\n pool.removeAllListeners(\"error\");\n pool.removeAllListeners(\"connect\");\n await pool.end();\n };\n}\n\n/**\n * Create a drizzle database driver for a plugin, choosing the engine by URL\n * scheme: `pglite:` / `:memory:` → embedded PGlite, anything else → postgres\n * (`pg.Pool`).\n *\n * Drivers stay externalized (never statically imported, never in the Module\n * Federation singleton share set) — they are loaded here via dynamic `import()`\n * only, and `drizzle-orm` appears as a runtime import for the `drizzle` entry\n * points. The `namespace` option expresses every topology the platform needs:\n * `plugin_<slug>` on a shared database, undefined for public-schema (api) or\n * dedicated-database (auth) workloads.\n */\nexport async function createDatabaseDriver<TSchema extends Record<string, unknown>>(\n url: string,\n schema: TSchema,\n namespace?: string,\n): Promise<DatabaseDriver<TSchema>> {\n if (url.startsWith(\"pglite:\") || url === \":memory:\") {\n const { drizzle } = await import(\"drizzle-orm/pglite\");\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const rawDir = url === \":memory:\" ? \":memory:\" : url.replace(\"pglite:\", \"\");\n const dataDir = rawDir.endsWith(\"/:memory:\") || rawDir === \":memory:\" ? \"memory://\" : rawDir;\n if (dataDir !== \"memory://\") {\n mkdirSync(dirname(dataDir), { recursive: true });\n }\n const pglite = new PGlite(dataDir);\n if (namespace) {\n await pglite.exec(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await pglite.exec(`SET search_path TO \"${namespace}\", public`);\n }\n const db = drizzle(pglite, { schema: schema as never }) as unknown as PgDatabase<\n PgQueryResultHKT,\n TSchema\n >;\n return {\n db,\n close: async () => {\n await pglite.close();\n },\n };\n }\n\n const { Pool } = await import(\"pg\");\n const { drizzle } = await import(\"drizzle-orm/node-postgres\");\n const pool = new Pool(buildPoolConfig(url, namespace) as never) as unknown as PoolLike;\n pool.on(\"error\", (err: Error) => {\n console.error(\"[Database] Unexpected pool error:\", err.message);\n });\n\n if (namespace) {\n await ensureNamespaceExists(pool, namespace);\n }\n\n const db = drizzle(pool as never, { schema: schema as never }) as unknown as PgDatabase<\n PgQueryResultHKT,\n TSchema\n >;\n\n return {\n db,\n close: createCloseHandler(pool),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ const require_binding = require('./binding.cjs');
2
+ let node_fs = require("node:fs");
3
+ let node_path = require("node:path");
4
+ let effect = require("effect");
5
+ let node_child_process = require("node:child_process");
6
+
7
+ //#region src/db/drizzle-kit.ts
8
+ var DrizzleKitError = class extends effect.Data.TaggedError("DrizzleKitError") {};
9
+ var DrizzleKit = class extends effect.Context.Service()("everything-dev/DrizzleKit") {};
10
+ /**
11
+ * The single choke point for invoking drizzle-kit. Every child receives the
12
+ * composition root's materialized environment (`bindingEnv`) so the config it
13
+ * evaluates never has to re-derive credentials from ambient state.
14
+ */
15
+ function spawnDrizzleKit(spec) {
16
+ return effect.Effect.callback((resume) => {
17
+ let stderr = "";
18
+ let settled = false;
19
+ const settle = (effect$1) => {
20
+ if (settled) return;
21
+ settled = true;
22
+ resume(effect$1);
23
+ };
24
+ const child = (0, node_child_process.spawn)(process.platform === "win32" ? "npx.cmd" : "npx", [...spec.args], {
25
+ cwd: spec.cwd,
26
+ env: spec.env,
27
+ stdio: spec.stdio
28
+ });
29
+ if (spec.stdio === "pipe") child.stderr?.on("data", (data) => {
30
+ stderr += data.toString();
31
+ });
32
+ child.on("error", (err) => {
33
+ const hint = err.code === "ENOENT" ? "\"npx\" not found. Ensure Node.js is installed." : err.message;
34
+ settle(effect.Effect.fail(new DrizzleKitError({
35
+ command: spec.command,
36
+ message: hint,
37
+ exitCode: void 0
38
+ })));
39
+ });
40
+ child.on("exit", (code) => {
41
+ if (code === 0 || code === null) {
42
+ settle(effect.Effect.void);
43
+ return;
44
+ }
45
+ settle(effect.Effect.fail(new DrizzleKitError({
46
+ command: spec.command,
47
+ message: `drizzle-kit ${spec.command} exited with code ${code}${stderr.trim() ? `: ${stderr.trim()}` : ""}`,
48
+ exitCode: code
49
+ })));
50
+ });
51
+ return effect.Effect.sync(() => {
52
+ if (child.exitCode === null && !child.killed) child.kill();
53
+ });
54
+ });
55
+ }
56
+ function childEnv(binding) {
57
+ return {
58
+ ...process.env,
59
+ ...require_binding.bindingEnv({
60
+ secretName: binding.identity.secretName,
61
+ url: binding.url
62
+ })
63
+ };
64
+ }
65
+ function workspaceConfigPath(binding) {
66
+ const workspaceDir = binding.identity.workspaceDir;
67
+ if (!workspaceDir) return void 0;
68
+ const configPath = (0, node_path.join)(workspaceDir, "drizzle.config.ts");
69
+ return (0, node_fs.existsSync)(configPath) ? configPath : void 0;
70
+ }
71
+ function writeGeneratedConfig(binding, projectDir) {
72
+ const dbDir = (0, node_path.resolve)(projectDir, ".bos", "db", binding.key);
73
+ (0, node_fs.mkdirSync)(dbDir, { recursive: true });
74
+ const configPath = (0, node_path.join)(dbDir, "drizzle.config.ts");
75
+ const configContent = `import { defineConfig } from "drizzle-kit";
76
+
77
+ export default defineConfig({
78
+ schema: "./drizzle/schema.ts",
79
+ out: "./drizzle",
80
+ dialect: "postgresql",
81
+ dbCredentials: {
82
+ url: "${binding.url}",
83
+ },
84
+ migrations: {
85
+ schema: "${binding.identity.journal.schema}",
86
+ table: "${binding.identity.journal.table}",
87
+ },
88
+ verbose: true,
89
+ strict: true,
90
+ });
91
+ `;
92
+ (0, node_fs.writeFileSync)(configPath, configContent);
93
+ return dbDir;
94
+ }
95
+ const makeDrizzleKitLive = (options) => effect.Layer.succeed(DrizzleKit, {
96
+ studio: (binding) => effect.Effect.gen(function* () {
97
+ const localConfig = workspaceConfigPath(binding);
98
+ if (localConfig && binding.identity.workspaceDir) {
99
+ options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);
100
+ yield* spawnDrizzleKit({
101
+ args: [
102
+ "drizzle-kit",
103
+ "studio",
104
+ "--config",
105
+ localConfig
106
+ ],
107
+ cwd: binding.identity.workspaceDir,
108
+ env: childEnv(binding),
109
+ command: "studio",
110
+ stdio: "inherit"
111
+ });
112
+ return;
113
+ }
114
+ if (binding.source === "local") return yield* new DrizzleKitError({
115
+ command: "studio",
116
+ message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. Run 'drizzle-kit init' first in the plugin workspace.`,
117
+ exitCode: void 0
118
+ });
119
+ options.onLog?.(`Introspecting database schema for ${binding.key}...`);
120
+ const dbDir = writeGeneratedConfig(binding, options.projectDir);
121
+ yield* spawnDrizzleKit({
122
+ args: [
123
+ "drizzle-kit",
124
+ "pull",
125
+ "--config",
126
+ (0, node_path.join)(dbDir, "drizzle.config.ts")
127
+ ],
128
+ cwd: dbDir,
129
+ env: childEnv(binding),
130
+ command: "pull",
131
+ stdio: "inherit"
132
+ }).pipe(effect.Effect.mapError((error) => new DrizzleKitError({
133
+ command: "pull",
134
+ exitCode: error.exitCode,
135
+ message: `Failed to introspect database for "${binding.key}". Check that ${binding.identity.secretName} is correct and the database is reachable. ` + error.message
136
+ })));
137
+ options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);
138
+ yield* spawnDrizzleKit({
139
+ args: [
140
+ "drizzle-kit",
141
+ "studio",
142
+ "--config",
143
+ (0, node_path.join)(dbDir, "drizzle.config.ts")
144
+ ],
145
+ cwd: dbDir,
146
+ env: childEnv(binding),
147
+ command: "studio",
148
+ stdio: "inherit"
149
+ });
150
+ }),
151
+ migrate: (binding) => {
152
+ const configPath = workspaceConfigPath(binding);
153
+ if (!configPath || !binding.identity.workspaceDir) return effect.Effect.fail(new DrizzleKitError({
154
+ command: "migrate",
155
+ message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,
156
+ exitCode: void 0
157
+ }));
158
+ return spawnDrizzleKit({
159
+ args: [
160
+ "drizzle-kit",
161
+ "migrate",
162
+ "--config",
163
+ configPath
164
+ ],
165
+ cwd: binding.identity.workspaceDir,
166
+ env: childEnv(binding),
167
+ command: "migrate",
168
+ stdio: "pipe"
169
+ });
170
+ }
171
+ });
172
+
173
+ //#endregion
174
+ exports.DrizzleKit = DrizzleKit;
175
+ exports.DrizzleKitError = DrizzleKitError;
176
+ exports.makeDrizzleKitLive = makeDrizzleKitLive;
177
+ //# sourceMappingURL=drizzle-kit.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-kit.cjs","names":["Data","Context","Effect","effect","spawn","bindingEnv","join","existsSync","resolve","Layer"],"sources":["../../src/db/drizzle-kit.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { bindingEnv } from \"./binding\";\nimport type { DatabaseBinding } from \"./bindings\";\n\nexport class DrizzleKitError extends Data.TaggedError(\"DrizzleKitError\")<{\n readonly command: string;\n readonly message: string;\n readonly exitCode: number | undefined;\n}> {}\n\nexport interface DrizzleKitService {\n readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n}\n\nexport class DrizzleKit extends Context.Service<DrizzleKit, DrizzleKitService>()(\n \"everything-dev/DrizzleKit\",\n) {}\n\ninterface SpawnSpec {\n readonly args: readonly string[];\n readonly cwd: string;\n readonly env: Record<string, string | undefined>;\n readonly command: string;\n readonly stdio: \"inherit\" | \"pipe\";\n}\n\n/**\n * The single choke point for invoking drizzle-kit. Every child receives the\n * composition root's materialized environment (`bindingEnv`) so the config it\n * evaluates never has to re-derive credentials from ambient state.\n */\nfunction spawnDrizzleKit(spec: SpawnSpec): Effect.Effect<void, DrizzleKitError> {\n return Effect.callback((resume) => {\n let stderr = \"\";\n let settled = false;\n const settle = (effect: Effect.Effect<void, DrizzleKitError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n const child = spawn(process.platform === \"win32\" ? \"npx.cmd\" : \"npx\", [...spec.args], {\n cwd: spec.cwd,\n env: spec.env,\n stdio: spec.stdio,\n });\n\n if (spec.stdio === \"pipe\") {\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"error\", (err) => {\n const hint =\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n ? '\"npx\" not found. Ensure Node.js is installed.'\n : err.message;\n settle(\n Effect.fail(\n new DrizzleKitError({ command: spec.command, message: hint, exitCode: undefined }),\n ),\n );\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n settle(Effect.void);\n return;\n }\n settle(\n Effect.fail(\n new DrizzleKitError({\n command: spec.command,\n message: `drizzle-kit ${spec.command} exited with code ${code}${\n stderr.trim() ? `: ${stderr.trim()}` : \"\"\n }`,\n exitCode: code,\n }),\n ),\n );\n });\n\n return Effect.sync(() => {\n if (child.exitCode === null && !child.killed) child.kill();\n });\n });\n}\n\nfunction childEnv(binding: DatabaseBinding): Record<string, string | undefined> {\n return {\n ...process.env,\n ...bindingEnv({ secretName: binding.identity.secretName, url: binding.url }),\n };\n}\n\nfunction workspaceConfigPath(binding: DatabaseBinding): string | undefined {\n const workspaceDir = binding.identity.workspaceDir;\n if (!workspaceDir) return undefined;\n const configPath = join(workspaceDir, \"drizzle.config.ts\");\n return existsSync(configPath) ? configPath : undefined;\n}\n\nfunction writeGeneratedConfig(binding: DatabaseBinding, projectDir: string): string {\n const dbDir = resolve(projectDir, \".bos\", \"db\", binding.key);\n mkdirSync(dbDir, { recursive: true });\n\n const configPath = join(dbDir, \"drizzle.config.ts\");\n const configContent = `import { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n schema: \"./drizzle/schema.ts\",\n out: \"./drizzle\",\n dialect: \"postgresql\",\n dbCredentials: {\n url: \"${binding.url}\",\n },\n migrations: {\n schema: \"${binding.identity.journal.schema}\",\n table: \"${binding.identity.journal.table}\",\n },\n verbose: true,\n strict: true,\n});\n`;\n\n writeFileSync(configPath, configContent);\n return dbDir;\n}\n\nexport interface DrizzleKitOptions {\n readonly projectDir: string;\n readonly onLog?: (message: string) => void;\n}\n\nexport const makeDrizzleKitLive = (options: DrizzleKitOptions): Layer.Layer<DrizzleKit> =>\n Layer.succeed(DrizzleKit, {\n studio: (binding) =>\n Effect.gen(function* () {\n const localConfig = workspaceConfigPath(binding);\n\n if (localConfig && binding.identity.workspaceDir) {\n options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", localConfig],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n return;\n }\n\n if (binding.source === \"local\") {\n return yield* new DrizzleKitError({\n command: \"studio\",\n message:\n `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. ` +\n `Run 'drizzle-kit init' first in the plugin workspace.`,\n exitCode: undefined,\n });\n }\n\n options.onLog?.(`Introspecting database schema for ${binding.key}...`);\n const dbDir = writeGeneratedConfig(binding, options.projectDir);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"pull\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"pull\",\n stdio: \"inherit\",\n }).pipe(\n Effect.mapError(\n (error) =>\n new DrizzleKitError({\n command: \"pull\",\n exitCode: error.exitCode,\n message:\n `Failed to introspect database for \"${binding.key}\". ` +\n `Check that ${binding.identity.secretName} is correct and the database is reachable. ` +\n error.message,\n }),\n ),\n );\n\n options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n }),\n\n migrate: (binding) => {\n const configPath = workspaceConfigPath(binding);\n if (!configPath || !binding.identity.workspaceDir) {\n return Effect.fail(\n new DrizzleKitError({\n command: \"migrate\",\n message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,\n exitCode: undefined,\n }),\n );\n }\n return spawnDrizzleKit({\n args: [\"drizzle-kit\", \"migrate\", \"--config\", configPath],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"migrate\",\n stdio: \"pipe\",\n });\n },\n });\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { DatabaseBinding } from "./bindings.cjs";
2
+ import { Context, Effect, Layer } from "effect";
3
+ //#region src/db/drizzle-kit.d.ts
4
+ declare const DrizzleKitError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
5
+ readonly _tag: "DrizzleKitError";
6
+ } & Readonly<A>;
7
+ declare class DrizzleKitError extends DrizzleKitError_base<{
8
+ readonly command: string;
9
+ readonly message: string;
10
+ readonly exitCode: number | undefined;
11
+ }> {}
12
+ interface DrizzleKitService {
13
+ readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
14
+ readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
15
+ }
16
+ declare const DrizzleKit_base: Context.ServiceClass<DrizzleKit, "everything-dev/DrizzleKit", DrizzleKitService>;
17
+ declare class DrizzleKit extends DrizzleKit_base {}
18
+ interface DrizzleKitOptions {
19
+ readonly projectDir: string;
20
+ readonly onLog?: (message: string) => void;
21
+ }
22
+ declare const makeDrizzleKitLive: (options: DrizzleKitOptions) => Layer.Layer<DrizzleKit>;
23
+ //#endregion
24
+ export { DrizzleKit, DrizzleKitError, DrizzleKitOptions, DrizzleKitService, makeDrizzleKitLive };
25
+ //# sourceMappingURL=drizzle-kit.d.cts.map
@@ -0,0 +1,25 @@
1
+ import { DatabaseBinding } from "./bindings.mjs";
2
+ import { Context, Effect, Layer } from "effect";
3
+ //#region src/db/drizzle-kit.d.ts
4
+ declare const DrizzleKitError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
5
+ readonly _tag: "DrizzleKitError";
6
+ } & Readonly<A>;
7
+ declare class DrizzleKitError extends DrizzleKitError_base<{
8
+ readonly command: string;
9
+ readonly message: string;
10
+ readonly exitCode: number | undefined;
11
+ }> {}
12
+ interface DrizzleKitService {
13
+ readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
14
+ readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
15
+ }
16
+ declare const DrizzleKit_base: Context.ServiceClass<DrizzleKit, "everything-dev/DrizzleKit", DrizzleKitService>;
17
+ declare class DrizzleKit extends DrizzleKit_base {}
18
+ interface DrizzleKitOptions {
19
+ readonly projectDir: string;
20
+ readonly onLog?: (message: string) => void;
21
+ }
22
+ declare const makeDrizzleKitLive: (options: DrizzleKitOptions) => Layer.Layer<DrizzleKit>;
23
+ //#endregion
24
+ export { DrizzleKit, DrizzleKitError, DrizzleKitOptions, DrizzleKitService, makeDrizzleKitLive };
25
+ //# sourceMappingURL=drizzle-kit.d.mts.map
@@ -0,0 +1,175 @@
1
+ import { bindingEnv } from "./binding.mjs";
2
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { Context, Data, Effect, Layer } from "effect";
5
+ import { spawn } from "node:child_process";
6
+
7
+ //#region src/db/drizzle-kit.ts
8
+ var DrizzleKitError = class extends Data.TaggedError("DrizzleKitError") {};
9
+ var DrizzleKit = class extends Context.Service()("everything-dev/DrizzleKit") {};
10
+ /**
11
+ * The single choke point for invoking drizzle-kit. Every child receives the
12
+ * composition root's materialized environment (`bindingEnv`) so the config it
13
+ * evaluates never has to re-derive credentials from ambient state.
14
+ */
15
+ function spawnDrizzleKit(spec) {
16
+ return Effect.callback((resume) => {
17
+ let stderr = "";
18
+ let settled = false;
19
+ const settle = (effect) => {
20
+ if (settled) return;
21
+ settled = true;
22
+ resume(effect);
23
+ };
24
+ const child = spawn(process.platform === "win32" ? "npx.cmd" : "npx", [...spec.args], {
25
+ cwd: spec.cwd,
26
+ env: spec.env,
27
+ stdio: spec.stdio
28
+ });
29
+ if (spec.stdio === "pipe") child.stderr?.on("data", (data) => {
30
+ stderr += data.toString();
31
+ });
32
+ child.on("error", (err) => {
33
+ const hint = err.code === "ENOENT" ? "\"npx\" not found. Ensure Node.js is installed." : err.message;
34
+ settle(Effect.fail(new DrizzleKitError({
35
+ command: spec.command,
36
+ message: hint,
37
+ exitCode: void 0
38
+ })));
39
+ });
40
+ child.on("exit", (code) => {
41
+ if (code === 0 || code === null) {
42
+ settle(Effect.void);
43
+ return;
44
+ }
45
+ settle(Effect.fail(new DrizzleKitError({
46
+ command: spec.command,
47
+ message: `drizzle-kit ${spec.command} exited with code ${code}${stderr.trim() ? `: ${stderr.trim()}` : ""}`,
48
+ exitCode: code
49
+ })));
50
+ });
51
+ return Effect.sync(() => {
52
+ if (child.exitCode === null && !child.killed) child.kill();
53
+ });
54
+ });
55
+ }
56
+ function childEnv(binding) {
57
+ return {
58
+ ...process.env,
59
+ ...bindingEnv({
60
+ secretName: binding.identity.secretName,
61
+ url: binding.url
62
+ })
63
+ };
64
+ }
65
+ function workspaceConfigPath(binding) {
66
+ const workspaceDir = binding.identity.workspaceDir;
67
+ if (!workspaceDir) return void 0;
68
+ const configPath = join(workspaceDir, "drizzle.config.ts");
69
+ return existsSync(configPath) ? configPath : void 0;
70
+ }
71
+ function writeGeneratedConfig(binding, projectDir) {
72
+ const dbDir = resolve(projectDir, ".bos", "db", binding.key);
73
+ mkdirSync(dbDir, { recursive: true });
74
+ const configPath = join(dbDir, "drizzle.config.ts");
75
+ const configContent = `import { defineConfig } from "drizzle-kit";
76
+
77
+ export default defineConfig({
78
+ schema: "./drizzle/schema.ts",
79
+ out: "./drizzle",
80
+ dialect: "postgresql",
81
+ dbCredentials: {
82
+ url: "${binding.url}",
83
+ },
84
+ migrations: {
85
+ schema: "${binding.identity.journal.schema}",
86
+ table: "${binding.identity.journal.table}",
87
+ },
88
+ verbose: true,
89
+ strict: true,
90
+ });
91
+ `;
92
+ writeFileSync(configPath, configContent);
93
+ return dbDir;
94
+ }
95
+ const makeDrizzleKitLive = (options) => Layer.succeed(DrizzleKit, {
96
+ studio: (binding) => Effect.gen(function* () {
97
+ const localConfig = workspaceConfigPath(binding);
98
+ if (localConfig && binding.identity.workspaceDir) {
99
+ options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);
100
+ yield* spawnDrizzleKit({
101
+ args: [
102
+ "drizzle-kit",
103
+ "studio",
104
+ "--config",
105
+ localConfig
106
+ ],
107
+ cwd: binding.identity.workspaceDir,
108
+ env: childEnv(binding),
109
+ command: "studio",
110
+ stdio: "inherit"
111
+ });
112
+ return;
113
+ }
114
+ if (binding.source === "local") return yield* new DrizzleKitError({
115
+ command: "studio",
116
+ message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. Run 'drizzle-kit init' first in the plugin workspace.`,
117
+ exitCode: void 0
118
+ });
119
+ options.onLog?.(`Introspecting database schema for ${binding.key}...`);
120
+ const dbDir = writeGeneratedConfig(binding, options.projectDir);
121
+ yield* spawnDrizzleKit({
122
+ args: [
123
+ "drizzle-kit",
124
+ "pull",
125
+ "--config",
126
+ join(dbDir, "drizzle.config.ts")
127
+ ],
128
+ cwd: dbDir,
129
+ env: childEnv(binding),
130
+ command: "pull",
131
+ stdio: "inherit"
132
+ }).pipe(Effect.mapError((error) => new DrizzleKitError({
133
+ command: "pull",
134
+ exitCode: error.exitCode,
135
+ message: `Failed to introspect database for "${binding.key}". Check that ${binding.identity.secretName} is correct and the database is reachable. ` + error.message
136
+ })));
137
+ options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);
138
+ yield* spawnDrizzleKit({
139
+ args: [
140
+ "drizzle-kit",
141
+ "studio",
142
+ "--config",
143
+ join(dbDir, "drizzle.config.ts")
144
+ ],
145
+ cwd: dbDir,
146
+ env: childEnv(binding),
147
+ command: "studio",
148
+ stdio: "inherit"
149
+ });
150
+ }),
151
+ migrate: (binding) => {
152
+ const configPath = workspaceConfigPath(binding);
153
+ if (!configPath || !binding.identity.workspaceDir) return Effect.fail(new DrizzleKitError({
154
+ command: "migrate",
155
+ message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,
156
+ exitCode: void 0
157
+ }));
158
+ return spawnDrizzleKit({
159
+ args: [
160
+ "drizzle-kit",
161
+ "migrate",
162
+ "--config",
163
+ configPath
164
+ ],
165
+ cwd: binding.identity.workspaceDir,
166
+ env: childEnv(binding),
167
+ command: "migrate",
168
+ stdio: "pipe"
169
+ });
170
+ }
171
+ });
172
+
173
+ //#endregion
174
+ export { DrizzleKit, DrizzleKitError, makeDrizzleKitLive };
175
+ //# sourceMappingURL=drizzle-kit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-kit.mjs","names":[],"sources":["../../src/db/drizzle-kit.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { bindingEnv } from \"./binding\";\nimport type { DatabaseBinding } from \"./bindings\";\n\nexport class DrizzleKitError extends Data.TaggedError(\"DrizzleKitError\")<{\n readonly command: string;\n readonly message: string;\n readonly exitCode: number | undefined;\n}> {}\n\nexport interface DrizzleKitService {\n readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n}\n\nexport class DrizzleKit extends Context.Service<DrizzleKit, DrizzleKitService>()(\n \"everything-dev/DrizzleKit\",\n) {}\n\ninterface SpawnSpec {\n readonly args: readonly string[];\n readonly cwd: string;\n readonly env: Record<string, string | undefined>;\n readonly command: string;\n readonly stdio: \"inherit\" | \"pipe\";\n}\n\n/**\n * The single choke point for invoking drizzle-kit. Every child receives the\n * composition root's materialized environment (`bindingEnv`) so the config it\n * evaluates never has to re-derive credentials from ambient state.\n */\nfunction spawnDrizzleKit(spec: SpawnSpec): Effect.Effect<void, DrizzleKitError> {\n return Effect.callback((resume) => {\n let stderr = \"\";\n let settled = false;\n const settle = (effect: Effect.Effect<void, DrizzleKitError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n const child = spawn(process.platform === \"win32\" ? \"npx.cmd\" : \"npx\", [...spec.args], {\n cwd: spec.cwd,\n env: spec.env,\n stdio: spec.stdio,\n });\n\n if (spec.stdio === \"pipe\") {\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"error\", (err) => {\n const hint =\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n ? '\"npx\" not found. Ensure Node.js is installed.'\n : err.message;\n settle(\n Effect.fail(\n new DrizzleKitError({ command: spec.command, message: hint, exitCode: undefined }),\n ),\n );\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n settle(Effect.void);\n return;\n }\n settle(\n Effect.fail(\n new DrizzleKitError({\n command: spec.command,\n message: `drizzle-kit ${spec.command} exited with code ${code}${\n stderr.trim() ? `: ${stderr.trim()}` : \"\"\n }`,\n exitCode: code,\n }),\n ),\n );\n });\n\n return Effect.sync(() => {\n if (child.exitCode === null && !child.killed) child.kill();\n });\n });\n}\n\nfunction childEnv(binding: DatabaseBinding): Record<string, string | undefined> {\n return {\n ...process.env,\n ...bindingEnv({ secretName: binding.identity.secretName, url: binding.url }),\n };\n}\n\nfunction workspaceConfigPath(binding: DatabaseBinding): string | undefined {\n const workspaceDir = binding.identity.workspaceDir;\n if (!workspaceDir) return undefined;\n const configPath = join(workspaceDir, \"drizzle.config.ts\");\n return existsSync(configPath) ? configPath : undefined;\n}\n\nfunction writeGeneratedConfig(binding: DatabaseBinding, projectDir: string): string {\n const dbDir = resolve(projectDir, \".bos\", \"db\", binding.key);\n mkdirSync(dbDir, { recursive: true });\n\n const configPath = join(dbDir, \"drizzle.config.ts\");\n const configContent = `import { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n schema: \"./drizzle/schema.ts\",\n out: \"./drizzle\",\n dialect: \"postgresql\",\n dbCredentials: {\n url: \"${binding.url}\",\n },\n migrations: {\n schema: \"${binding.identity.journal.schema}\",\n table: \"${binding.identity.journal.table}\",\n },\n verbose: true,\n strict: true,\n});\n`;\n\n writeFileSync(configPath, configContent);\n return dbDir;\n}\n\nexport interface DrizzleKitOptions {\n readonly projectDir: string;\n readonly onLog?: (message: string) => void;\n}\n\nexport const makeDrizzleKitLive = (options: DrizzleKitOptions): Layer.Layer<DrizzleKit> =>\n Layer.succeed(DrizzleKit, {\n studio: (binding) =>\n Effect.gen(function* () {\n const localConfig = workspaceConfigPath(binding);\n\n if (localConfig && binding.identity.workspaceDir) {\n options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", localConfig],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n return;\n }\n\n if (binding.source === \"local\") {\n return yield* new DrizzleKitError({\n command: \"studio\",\n message:\n `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. ` +\n `Run 'drizzle-kit init' first in the plugin workspace.`,\n exitCode: undefined,\n });\n }\n\n options.onLog?.(`Introspecting database schema for ${binding.key}...`);\n const dbDir = writeGeneratedConfig(binding, options.projectDir);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"pull\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"pull\",\n stdio: \"inherit\",\n }).pipe(\n Effect.mapError(\n (error) =>\n new DrizzleKitError({\n command: \"pull\",\n exitCode: error.exitCode,\n message:\n `Failed to introspect database for \"${binding.key}\". ` +\n `Check that ${binding.identity.secretName} is correct and the database is reachable. ` +\n error.message,\n }),\n ),\n );\n\n options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n }),\n\n migrate: (binding) => {\n const configPath = workspaceConfigPath(binding);\n if (!configPath || !binding.identity.workspaceDir) {\n return Effect.fail(\n new DrizzleKitError({\n command: \"migrate\",\n message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,\n exitCode: undefined,\n }),\n );\n }\n return spawnDrizzleKit({\n args: [\"drizzle-kit\", \"migrate\", \"--config\", configPath],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"migrate\",\n stdio: \"pipe\",\n });\n },\n });\n"],"mappings":"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"}