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
@@ -0,0 +1,144 @@
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ let node_fs = require("node:fs");
3
+ let node_path = require("node:path");
4
+ let effect = require("effect");
5
+ let node_crypto = require("node:crypto");
6
+ let node_process = require("node:process");
7
+ node_process = require_runtime.__toESM(node_process, 1);
8
+ let dotenv = require("dotenv");
9
+ let _clack_prompts = require("@clack/prompts");
10
+ _clack_prompts = require_runtime.__toESM(_clack_prompts, 1);
11
+
12
+ //#region src/env/project-env.ts
13
+ var EnvEnsureError = class extends effect.Data.TaggedError("EnvEnsureError") {};
14
+ var EnvLoadError = class extends effect.Data.TaggedError("EnvLoadError") {};
15
+ var EnvSyncError = class extends effect.Data.TaggedError("EnvSyncError") {};
16
+ /**
17
+ * The process environment as exported by the parent shell. Values present
18
+ * here were explicitly provided by the caller (shell, CI, the regression
19
+ * harness) and therefore outrank planner-generated values; values that only
20
+ * exist after `.env` loading do not. The bootstrap program captures this
21
+ * snapshot as its first step — before any `.env` loading — and provides it
22
+ * to the rest of the program as a service.
23
+ */
24
+ var ShellEnv = class extends effect.Context.Service()("everything-dev/ShellEnv") {};
25
+ const captureShellEnv = effect.Effect.sync(() => Object.fromEntries(Object.entries(node_process.default.env).filter((entry) => entry[1] != null)));
26
+ const ShellEnvLive = (env) => effect.Layer.succeed(ShellEnv, env);
27
+ /**
28
+ * Align the bos-owned lines of `.env` with the generated infra env
29
+ * (ports/secrets derived from the resolved dev topology). Keys the caller
30
+ * explicitly exported (`shellEnv`) are skipped — a deliberate override must
31
+ * not be silently reverted on disk. Lines the user added outside the
32
+ * generated key set are untouched. Idempotent.
33
+ */
34
+ const GENERATED_OWNED_KEYS = /* @__PURE__ */ new Set(["BASE_URL", "CORS_ORIGIN"]);
35
+ const maskValue = (key, value) => {
36
+ if (value === void 0) return "(absent)";
37
+ if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) return value.replace(/\/\/([^:/@]+):([^@]+)@/, "//***:***@");
38
+ return value;
39
+ };
40
+ const syncEnvFile = (configDir, generated, shellEnv = {}) => effect.Effect.gen(function* () {
41
+ if (Object.keys(generated).length === 0) return [];
42
+ const envPath = (0, node_path.join)(configDir, ".env");
43
+ if (!(0, node_fs.existsSync)(envPath)) return [];
44
+ const lines = yield* effect.Effect.try({
45
+ try: () => (0, node_fs.readFileSync)(envPath, "utf-8").split("\n"),
46
+ catch: (cause) => new EnvSyncError({ cause })
47
+ });
48
+ const drift = [];
49
+ const seen = /* @__PURE__ */ new Set();
50
+ const keyOf = (line) => {
51
+ return /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line)?.[1] ?? null;
52
+ };
53
+ const updated = lines.map((line) => {
54
+ const key = keyOf(line);
55
+ if (!key || !(key in generated)) return line;
56
+ if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) return line;
57
+ seen.add(key);
58
+ const value = line.slice(key.length + 1);
59
+ if (value === generated[key]) return line;
60
+ drift.push({
61
+ key,
62
+ from: value,
63
+ to: generated[key]
64
+ });
65
+ return `${key}=${generated[key]}`;
66
+ });
67
+ for (const [key, value] of Object.entries(generated)) {
68
+ if (seen.has(key)) continue;
69
+ if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) continue;
70
+ drift.push({
71
+ key,
72
+ from: void 0,
73
+ to: value
74
+ });
75
+ updated.push(`${key}=${value}`);
76
+ }
77
+ if (drift.length > 0) {
78
+ yield* effect.Effect.try({
79
+ try: () => (0, node_fs.writeFileSync)(envPath, updated.join("\n")),
80
+ catch: (cause) => new EnvSyncError({ cause })
81
+ });
82
+ for (const { key, from, to } of drift) yield* effect.Effect.logInfo(`[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`);
83
+ }
84
+ return drift;
85
+ });
86
+ var ProjectEnv = class extends effect.Context.Service()("everything-dev/ProjectEnv") {};
87
+ const makeProjectEnv = () => {
88
+ const loadedDirs = /* @__PURE__ */ new Set();
89
+ return {
90
+ ensureFile: (configDir) => effect.Effect.try({
91
+ try: () => {
92
+ const envPath = (0, node_path.join)(configDir, ".env");
93
+ const examplePath = (0, node_path.join)(configDir, ".env.example");
94
+ if ((0, node_fs.existsSync)(envPath) || !(0, node_fs.existsSync)(examplePath)) return false;
95
+ const lines = (0, node_fs.readFileSync)(examplePath, "utf-8").split("\n");
96
+ const secret = (0, node_crypto.randomBytes)(32).toString("base64url");
97
+ const updated = lines.map((line) => {
98
+ if (line.startsWith("BETTER_AUTH_SECRET=")) return `BETTER_AUTH_SECRET=${secret}`;
99
+ return line;
100
+ }).join("\n");
101
+ (0, node_fs.writeFileSync)(envPath, updated);
102
+ _clack_prompts.log.info("Created .env from generated .env.example with generated BETTER_AUTH_SECRET");
103
+ return true;
104
+ },
105
+ catch: (cause) => new EnvEnsureError({ cause })
106
+ }),
107
+ load: (configDir, options) => effect.Effect.gen(function* () {
108
+ if (!options?.force && loadedDirs.has(configDir)) return;
109
+ const envPath = (0, node_path.join)(configDir, ".env");
110
+ if (!(0, node_fs.existsSync)(envPath)) return;
111
+ yield* effect.Effect.try({
112
+ try: () => (0, dotenv.config)({
113
+ path: envPath,
114
+ processEnv: node_process.default.env,
115
+ quiet: true
116
+ }),
117
+ catch: (cause) => new EnvLoadError({ cause })
118
+ });
119
+ loadedDirs.add(configDir);
120
+ }),
121
+ sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv)
122
+ };
123
+ };
124
+ /**
125
+ * One `ProjectEnv` implementation, installed in two scopes: the CLI provides
126
+ * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the
127
+ * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`
128
+ * is that implementation; command and test callers that need a single shot use
129
+ * the factory and do not register another service.
130
+ */
131
+ const ProjectEnvLive = effect.Layer.sync(ProjectEnv, () => makeProjectEnv());
132
+
133
+ //#endregion
134
+ exports.EnvEnsureError = EnvEnsureError;
135
+ exports.EnvLoadError = EnvLoadError;
136
+ exports.EnvSyncError = EnvSyncError;
137
+ exports.ProjectEnv = ProjectEnv;
138
+ exports.ProjectEnvLive = ProjectEnvLive;
139
+ exports.ShellEnv = ShellEnv;
140
+ exports.ShellEnvLive = ShellEnvLive;
141
+ exports.captureShellEnv = captureShellEnv;
142
+ exports.makeProjectEnv = makeProjectEnv;
143
+ exports.syncEnvFile = syncEnvFile;
144
+ //# sourceMappingURL=project-env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-env.cjs","names":["Data","Context","Effect","process","Layer","join","existsSync","readFileSync","writeFileSync","randomBytes","loadDotenv"],"sources":["../../src/env/project-env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { Context, Data, Effect, Layer } from \"effect\";\n\nexport class EnvEnsureError extends Data.TaggedError(\"EnvEnsureError\")<{ cause: unknown }> {}\n\nexport class EnvLoadError extends Data.TaggedError(\"EnvLoadError\")<{ cause: unknown }> {}\n\nexport interface EnvDrift {\n key: string;\n from: string | undefined;\n to: string;\n}\n\nexport class EnvSyncError extends Data.TaggedError(\"EnvSyncError\")<{ cause: unknown }> {}\n\n/**\n * The process environment as exported by the parent shell. Values present\n * here were explicitly provided by the caller (shell, CI, the regression\n * harness) and therefore outrank planner-generated values; values that only\n * exist after `.env` loading do not. The bootstrap program captures this\n * snapshot as its first step — before any `.env` loading — and provides it\n * to the rest of the program as a service.\n */\nexport class ShellEnv extends Context.Service<ShellEnv, Record<string, string>>()(\n \"everything-dev/ShellEnv\",\n) {}\n\nexport const captureShellEnv: Effect.Effect<Record<string, string>> = Effect.sync(() =>\n Object.fromEntries(\n Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] != null),\n ),\n);\n\nexport const ShellEnvLive = (env: Record<string, string>) => Layer.succeed(ShellEnv, env);\n\n/**\n * Align the bos-owned lines of `.env` with the generated infra env\n * (ports/secrets derived from the resolved dev topology). Keys the caller\n * explicitly exported (`shellEnv`) are skipped — a deliberate override must\n * not be silently reverted on disk. Lines the user added outside the\n * generated key set are untouched. Idempotent.\n */\nconst GENERATED_OWNED_KEYS = new Set([\"BASE_URL\", \"CORS_ORIGIN\"]);\n\nconst maskValue = (key: string, value: string | undefined): string => {\n if (value === undefined) return \"(absent)\";\n if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) {\n return value.replace(/\\/\\/([^:/@]+):([^@]+)@/, \"//***:***@\");\n }\n return value;\n};\n\nexport const syncEnvFile = (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string> = {},\n): Effect.Effect<EnvDrift[], EnvSyncError> =>\n Effect.gen(function* () {\n if (Object.keys(generated).length === 0) return [];\n\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return [];\n\n const lines = yield* Effect.try({\n try: () => readFileSync(envPath, \"utf-8\").split(\"\\n\"),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n\n const drift: EnvDrift[] = [];\n const seen = new Set<string>();\n const keyOf = (line: string): string | null => {\n const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);\n return match?.[1] ?? null;\n };\n\n const updated = lines.map((line) => {\n const key = keyOf(line);\n if (!key || !(key in generated)) return line;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) return line;\n seen.add(key);\n const value = line.slice(key.length + 1);\n if (value === generated[key]) return line;\n drift.push({ key, from: value, to: generated[key] });\n return `${key}=${generated[key]}`;\n });\n\n for (const [key, value] of Object.entries(generated)) {\n if (seen.has(key)) continue;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) continue;\n drift.push({ key, from: undefined, to: value });\n updated.push(`${key}=${value}`);\n }\n\n if (drift.length > 0) {\n yield* Effect.try({\n try: () => writeFileSync(envPath, updated.join(\"\\n\")),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n for (const { key, from, to } of drift) {\n yield* Effect.logInfo(\n `[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`,\n );\n }\n }\n return drift;\n });\n\nexport interface ProjectEnvService {\n readonly ensureFile: (configDir: string) => Effect.Effect<boolean, EnvEnsureError>;\n readonly load: (\n configDir: string,\n options?: { force?: boolean },\n ) => Effect.Effect<void, EnvLoadError>;\n readonly sync: (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string>,\n ) => Effect.Effect<EnvDrift[], EnvSyncError>;\n}\n\nexport class ProjectEnv extends Context.Service<ProjectEnv, ProjectEnvService>()(\n \"everything-dev/ProjectEnv\",\n) {}\n\nexport const makeProjectEnv = (): ProjectEnvService => {\n const loadedDirs = new Set<string>();\n return {\n ensureFile: (configDir) =>\n Effect.try({\n try: () => {\n const envPath = join(configDir, \".env\");\n const examplePath = join(configDir, \".env.example\");\n if (existsSync(envPath) || !existsSync(examplePath)) return false;\n\n const content = readFileSync(examplePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const secret = randomBytes(32).toString(\"base64url\");\n const updated = lines\n .map((line) => {\n if (line.startsWith(\"BETTER_AUTH_SECRET=\")) {\n return `BETTER_AUTH_SECRET=${secret}`;\n }\n return line;\n })\n .join(\"\\n\");\n\n writeFileSync(envPath, updated);\n p.log.info(\"Created .env from generated .env.example with generated BETTER_AUTH_SECRET\");\n return true;\n },\n catch: (cause) => new EnvEnsureError({ cause }),\n }),\n load: (configDir, options) =>\n Effect.gen(function* () {\n if (!options?.force && loadedDirs.has(configDir)) return;\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return;\n\n yield* Effect.try({\n try: () => loadDotenv({ path: envPath, processEnv: process.env, quiet: true }),\n catch: (cause) => new EnvLoadError({ cause }),\n });\n loadedDirs.add(configDir);\n }),\n sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv),\n };\n};\n\n/**\n * One `ProjectEnv` implementation, installed in two scopes: the CLI provides\n * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the\n * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`\n * is that implementation; command and test callers that need a single shot use\n * the factory and do not register another service.\n */\nexport const ProjectEnvLive: Layer.Layer<ProjectEnv> = Layer.sync(ProjectEnv, () =>\n makeProjectEnv(),\n);\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import { Context, Effect, Layer } from "effect";
@@ -0,0 +1 @@
1
+ import { Context, Effect, Layer } from "effect";
@@ -0,0 +1,132 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { Context, Data, Effect, Layer } from "effect";
4
+ import { randomBytes } from "node:crypto";
5
+ import process from "node:process";
6
+ import { config } from "dotenv";
7
+ import * as p from "@clack/prompts";
8
+
9
+ //#region src/env/project-env.ts
10
+ var EnvEnsureError = class extends Data.TaggedError("EnvEnsureError") {};
11
+ var EnvLoadError = class extends Data.TaggedError("EnvLoadError") {};
12
+ var EnvSyncError = class extends Data.TaggedError("EnvSyncError") {};
13
+ /**
14
+ * The process environment as exported by the parent shell. Values present
15
+ * here were explicitly provided by the caller (shell, CI, the regression
16
+ * harness) and therefore outrank planner-generated values; values that only
17
+ * exist after `.env` loading do not. The bootstrap program captures this
18
+ * snapshot as its first step — before any `.env` loading — and provides it
19
+ * to the rest of the program as a service.
20
+ */
21
+ var ShellEnv = class extends Context.Service()("everything-dev/ShellEnv") {};
22
+ const captureShellEnv = Effect.sync(() => Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] != null)));
23
+ const ShellEnvLive = (env) => Layer.succeed(ShellEnv, env);
24
+ /**
25
+ * Align the bos-owned lines of `.env` with the generated infra env
26
+ * (ports/secrets derived from the resolved dev topology). Keys the caller
27
+ * explicitly exported (`shellEnv`) are skipped — a deliberate override must
28
+ * not be silently reverted on disk. Lines the user added outside the
29
+ * generated key set are untouched. Idempotent.
30
+ */
31
+ const GENERATED_OWNED_KEYS = /* @__PURE__ */ new Set(["BASE_URL", "CORS_ORIGIN"]);
32
+ const maskValue = (key, value) => {
33
+ if (value === void 0) return "(absent)";
34
+ if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) return value.replace(/\/\/([^:/@]+):([^@]+)@/, "//***:***@");
35
+ return value;
36
+ };
37
+ const syncEnvFile = (configDir, generated, shellEnv = {}) => Effect.gen(function* () {
38
+ if (Object.keys(generated).length === 0) return [];
39
+ const envPath = join(configDir, ".env");
40
+ if (!existsSync(envPath)) return [];
41
+ const lines = yield* Effect.try({
42
+ try: () => readFileSync(envPath, "utf-8").split("\n"),
43
+ catch: (cause) => new EnvSyncError({ cause })
44
+ });
45
+ const drift = [];
46
+ const seen = /* @__PURE__ */ new Set();
47
+ const keyOf = (line) => {
48
+ return /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line)?.[1] ?? null;
49
+ };
50
+ const updated = lines.map((line) => {
51
+ const key = keyOf(line);
52
+ if (!key || !(key in generated)) return line;
53
+ if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) return line;
54
+ seen.add(key);
55
+ const value = line.slice(key.length + 1);
56
+ if (value === generated[key]) return line;
57
+ drift.push({
58
+ key,
59
+ from: value,
60
+ to: generated[key]
61
+ });
62
+ return `${key}=${generated[key]}`;
63
+ });
64
+ for (const [key, value] of Object.entries(generated)) {
65
+ if (seen.has(key)) continue;
66
+ if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) continue;
67
+ drift.push({
68
+ key,
69
+ from: void 0,
70
+ to: value
71
+ });
72
+ updated.push(`${key}=${value}`);
73
+ }
74
+ if (drift.length > 0) {
75
+ yield* Effect.try({
76
+ try: () => writeFileSync(envPath, updated.join("\n")),
77
+ catch: (cause) => new EnvSyncError({ cause })
78
+ });
79
+ for (const { key, from, to } of drift) yield* Effect.logInfo(`[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`);
80
+ }
81
+ return drift;
82
+ });
83
+ var ProjectEnv = class extends Context.Service()("everything-dev/ProjectEnv") {};
84
+ const makeProjectEnv = () => {
85
+ const loadedDirs = /* @__PURE__ */ new Set();
86
+ return {
87
+ ensureFile: (configDir) => Effect.try({
88
+ try: () => {
89
+ const envPath = join(configDir, ".env");
90
+ const examplePath = join(configDir, ".env.example");
91
+ if (existsSync(envPath) || !existsSync(examplePath)) return false;
92
+ const lines = readFileSync(examplePath, "utf-8").split("\n");
93
+ const secret = randomBytes(32).toString("base64url");
94
+ const updated = lines.map((line) => {
95
+ if (line.startsWith("BETTER_AUTH_SECRET=")) return `BETTER_AUTH_SECRET=${secret}`;
96
+ return line;
97
+ }).join("\n");
98
+ writeFileSync(envPath, updated);
99
+ p.log.info("Created .env from generated .env.example with generated BETTER_AUTH_SECRET");
100
+ return true;
101
+ },
102
+ catch: (cause) => new EnvEnsureError({ cause })
103
+ }),
104
+ load: (configDir, options) => Effect.gen(function* () {
105
+ if (!options?.force && loadedDirs.has(configDir)) return;
106
+ const envPath = join(configDir, ".env");
107
+ if (!existsSync(envPath)) return;
108
+ yield* Effect.try({
109
+ try: () => config({
110
+ path: envPath,
111
+ processEnv: process.env,
112
+ quiet: true
113
+ }),
114
+ catch: (cause) => new EnvLoadError({ cause })
115
+ });
116
+ loadedDirs.add(configDir);
117
+ }),
118
+ sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv)
119
+ };
120
+ };
121
+ /**
122
+ * One `ProjectEnv` implementation, installed in two scopes: the CLI provides
123
+ * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the
124
+ * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`
125
+ * is that implementation; command and test callers that need a single shot use
126
+ * the factory and do not register another service.
127
+ */
128
+ const ProjectEnvLive = Layer.sync(ProjectEnv, () => makeProjectEnv());
129
+
130
+ //#endregion
131
+ export { EnvEnsureError, EnvLoadError, EnvSyncError, ProjectEnv, ProjectEnvLive, ShellEnv, ShellEnvLive, captureShellEnv, makeProjectEnv, syncEnvFile };
132
+ //# sourceMappingURL=project-env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-env.mjs","names":["loadDotenv"],"sources":["../../src/env/project-env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { Context, Data, Effect, Layer } from \"effect\";\n\nexport class EnvEnsureError extends Data.TaggedError(\"EnvEnsureError\")<{ cause: unknown }> {}\n\nexport class EnvLoadError extends Data.TaggedError(\"EnvLoadError\")<{ cause: unknown }> {}\n\nexport interface EnvDrift {\n key: string;\n from: string | undefined;\n to: string;\n}\n\nexport class EnvSyncError extends Data.TaggedError(\"EnvSyncError\")<{ cause: unknown }> {}\n\n/**\n * The process environment as exported by the parent shell. Values present\n * here were explicitly provided by the caller (shell, CI, the regression\n * harness) and therefore outrank planner-generated values; values that only\n * exist after `.env` loading do not. The bootstrap program captures this\n * snapshot as its first step — before any `.env` loading — and provides it\n * to the rest of the program as a service.\n */\nexport class ShellEnv extends Context.Service<ShellEnv, Record<string, string>>()(\n \"everything-dev/ShellEnv\",\n) {}\n\nexport const captureShellEnv: Effect.Effect<Record<string, string>> = Effect.sync(() =>\n Object.fromEntries(\n Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] != null),\n ),\n);\n\nexport const ShellEnvLive = (env: Record<string, string>) => Layer.succeed(ShellEnv, env);\n\n/**\n * Align the bos-owned lines of `.env` with the generated infra env\n * (ports/secrets derived from the resolved dev topology). Keys the caller\n * explicitly exported (`shellEnv`) are skipped — a deliberate override must\n * not be silently reverted on disk. Lines the user added outside the\n * generated key set are untouched. Idempotent.\n */\nconst GENERATED_OWNED_KEYS = new Set([\"BASE_URL\", \"CORS_ORIGIN\"]);\n\nconst maskValue = (key: string, value: string | undefined): string => {\n if (value === undefined) return \"(absent)\";\n if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) {\n return value.replace(/\\/\\/([^:/@]+):([^@]+)@/, \"//***:***@\");\n }\n return value;\n};\n\nexport const syncEnvFile = (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string> = {},\n): Effect.Effect<EnvDrift[], EnvSyncError> =>\n Effect.gen(function* () {\n if (Object.keys(generated).length === 0) return [];\n\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return [];\n\n const lines = yield* Effect.try({\n try: () => readFileSync(envPath, \"utf-8\").split(\"\\n\"),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n\n const drift: EnvDrift[] = [];\n const seen = new Set<string>();\n const keyOf = (line: string): string | null => {\n const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);\n return match?.[1] ?? null;\n };\n\n const updated = lines.map((line) => {\n const key = keyOf(line);\n if (!key || !(key in generated)) return line;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) return line;\n seen.add(key);\n const value = line.slice(key.length + 1);\n if (value === generated[key]) return line;\n drift.push({ key, from: value, to: generated[key] });\n return `${key}=${generated[key]}`;\n });\n\n for (const [key, value] of Object.entries(generated)) {\n if (seen.has(key)) continue;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) continue;\n drift.push({ key, from: undefined, to: value });\n updated.push(`${key}=${value}`);\n }\n\n if (drift.length > 0) {\n yield* Effect.try({\n try: () => writeFileSync(envPath, updated.join(\"\\n\")),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n for (const { key, from, to } of drift) {\n yield* Effect.logInfo(\n `[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`,\n );\n }\n }\n return drift;\n });\n\nexport interface ProjectEnvService {\n readonly ensureFile: (configDir: string) => Effect.Effect<boolean, EnvEnsureError>;\n readonly load: (\n configDir: string,\n options?: { force?: boolean },\n ) => Effect.Effect<void, EnvLoadError>;\n readonly sync: (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string>,\n ) => Effect.Effect<EnvDrift[], EnvSyncError>;\n}\n\nexport class ProjectEnv extends Context.Service<ProjectEnv, ProjectEnvService>()(\n \"everything-dev/ProjectEnv\",\n) {}\n\nexport const makeProjectEnv = (): ProjectEnvService => {\n const loadedDirs = new Set<string>();\n return {\n ensureFile: (configDir) =>\n Effect.try({\n try: () => {\n const envPath = join(configDir, \".env\");\n const examplePath = join(configDir, \".env.example\");\n if (existsSync(envPath) || !existsSync(examplePath)) return false;\n\n const content = readFileSync(examplePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const secret = randomBytes(32).toString(\"base64url\");\n const updated = lines\n .map((line) => {\n if (line.startsWith(\"BETTER_AUTH_SECRET=\")) {\n return `BETTER_AUTH_SECRET=${secret}`;\n }\n return line;\n })\n .join(\"\\n\");\n\n writeFileSync(envPath, updated);\n p.log.info(\"Created .env from generated .env.example with generated BETTER_AUTH_SECRET\");\n return true;\n },\n catch: (cause) => new EnvEnsureError({ cause }),\n }),\n load: (configDir, options) =>\n Effect.gen(function* () {\n if (!options?.force && loadedDirs.has(configDir)) return;\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return;\n\n yield* Effect.try({\n try: () => loadDotenv({ path: envPath, processEnv: process.env, quiet: true }),\n catch: (cause) => new EnvLoadError({ cause }),\n });\n loadedDirs.add(configDir);\n }),\n sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv),\n };\n};\n\n/**\n * One `ProjectEnv` implementation, installed in two scopes: the CLI provides\n * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the\n * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`\n * is that implementation; command and test callers that need a single shot use\n * the factory and do not register another service.\n */\nexport const ProjectEnvLive: Layer.Layer<ProjectEnv> = Layer.sync(ProjectEnv, () =>\n makeProjectEnv(),\n);\n"],"mappings":"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"}
package/dist/fastkv.cjs CHANGED
@@ -5,29 +5,34 @@ const require_http_client = require('./http-client.cjs');
5
5
  function getNetworkIdForAccount(accountId) {
6
6
  return accountId.endsWith(".testnet") ? "testnet" : "mainnet";
7
7
  }
8
+ const FASTKV_TESTNET_URL = "https://kv.test.fastnear.com";
9
+ const FASTKV_MAINNET_URL = "https://kv.main.fastnear.com";
10
+ const REGISTRY_NAMESPACE_TESTNET = "dev.allthethings.testnet";
11
+ const REGISTRY_NAMESPACE_MAINNET = "dev.everything.near";
8
12
  function getFastKvBaseUrlForNetwork(network) {
9
- return network === "testnet" ? process.env.REGISTRY_FASTKV_TESTNET_URL || "https://kv.test.fastnear.com" : process.env.REGISTRY_FASTKV_MAINNET_URL || "https://kv.main.fastnear.com";
13
+ return network === "testnet" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;
10
14
  }
11
15
  function getFastKvBaseUrlForAccount(accountId) {
12
16
  return getNetworkIdForAccount(accountId) === "testnet" ? getFastKvBaseUrlForNetwork("testnet") : getFastKvBaseUrlForNetwork("mainnet");
13
17
  }
14
- function buildRegistryConfigUrl(accountId, gatewayId) {
18
+ function buildRegistryConfigUrl(accountId, gatewayId, registry) {
15
19
  const baseUrl = getFastKvBaseUrlForAccount(accountId);
16
- const namespace = getRegistryNamespaceForAccount(accountId);
20
+ const namespace = getRegistryNamespaceForAccount(accountId, registry);
17
21
  const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
18
22
  return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
19
23
  }
20
- function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId) {
24
+ function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId, registry) {
21
25
  const baseUrl = getFastKvBaseUrlForNetwork(network);
22
- const namespace = getRegistryNamespaceForNetwork(network);
26
+ const namespace = getRegistryNamespaceForNetwork(network, registry);
23
27
  const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
24
28
  return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
25
29
  }
26
- function getRegistryNamespaceForAccount(accountId) {
27
- return accountId.endsWith(".testnet") ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || "dev.everything.near" : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || "dev.everything.near";
30
+ function getRegistryNamespaceForAccount(accountId, registry) {
31
+ return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));
28
32
  }
29
- function getRegistryNamespaceForNetwork(network) {
30
- return network === "testnet" ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || "dev.everything.near" : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || "dev.everything.near";
33
+ function getRegistryNamespaceForNetwork(network, registry) {
34
+ if (registry) return registry;
35
+ return network === "testnet" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;
31
36
  }
32
37
  function getRegistryConfigKey(accountId, gatewayId, pathSegments = []) {
33
38
  return `apps/${accountId}/${gatewayId}${pathSegments.length > 0 ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join("/")}` : ""}/bos.config.json`;
@@ -45,17 +50,57 @@ function parseBosUrl(bosUrl) {
45
50
  pathSegments: pathSegmentsTail
46
51
  };
47
52
  }
48
- async function fetchBosConfigFromFastKv(bosUrl) {
53
+ async function fetchBosConfigFromFastKv(bosUrl, registry) {
49
54
  const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);
50
55
  const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));
51
- const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
56
+ const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
52
57
  if (!value) throw new Error(`No config found for ${bosUrl}`);
53
58
  if (typeof value === "string") return JSON.parse(value);
54
59
  if (typeof value !== "object") throw new Error(`Invalid config value for ${bosUrl}`);
55
60
  return value;
56
61
  }
62
+ const FASTKV_HISTORY_MAX_LIMIT = 200;
63
+ /**
64
+ * Publish history for the registry config key (atomic-deploys 11): the
65
+ * exact-key variant of FastData's history endpoint, newest-first. The API
66
+ * caps a page at 200 rows; a config key's write history fits well inside
67
+ * that, so a single request is the whole story (the limit param is clamped).
68
+ */
69
+ async function fetchConfigHistory(opts) {
70
+ const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));
71
+ const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));
72
+ return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`))?.entries ?? []).filter(Boolean).map((entry) => ({
73
+ blockHeight: entry.block_height ?? 0,
74
+ blockTimestampNs: String(entry.block_timestamp ?? ""),
75
+ ...entry.tx_hash ? { txHash: entry.tx_hash } : {},
76
+ value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
77
+ })).sort((a, b) => b.blockHeight - a.blockHeight);
78
+ }
79
+ /**
80
+ * The per-deploy audit trail (atomic-deploys 03/12): every publish writes
81
+ * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
82
+ * swap — this lists that key family newest-first via the history-by-prefix
83
+ * endpoint.
84
+ */
85
+ async function fetchDeployManifests(opts) {
86
+ const keyPrefix = encodeURIComponent(`${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\.config\.json$/, "")}manifests/`);
87
+ return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`, {
88
+ method: "POST",
89
+ body: JSON.stringify({
90
+ key_prefix: decodeURIComponent(keyPrefix),
91
+ asc: false,
92
+ limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT))
93
+ })
94
+ }))?.entries ?? []).filter(Boolean).map((entry) => ({
95
+ key: entry.key ?? "",
96
+ blockHeight: entry.block_height ?? 0,
97
+ blockTimestampNs: String(entry.block_timestamp ?? ""),
98
+ value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
99
+ })).sort((a, b) => b.blockHeight - a.blockHeight);
100
+ }
57
101
  async function fetchRemotePluginManifest(cdnUrl) {
58
- return require_http_client.fetchJsonOrNull(`${cdnUrl.replace(/\/$/, "")}/plugin.manifest.json`, { retries: 0 });
102
+ const baseUrl = cdnUrl.replace(/\/$/, "");
103
+ return require_http_client.fetchJsonOrNull(`${baseUrl}/plugin.manifest.json`, { retries: 2 });
59
104
  }
60
105
  async function fetchJson(url, init) {
61
106
  const headers = {
@@ -75,6 +120,8 @@ async function fetchJson(url, init) {
75
120
  exports.buildRegistryConfigUrl = buildRegistryConfigUrl;
76
121
  exports.buildRegistryConfigUrlForNetwork = buildRegistryConfigUrlForNetwork;
77
122
  exports.fetchBosConfigFromFastKv = fetchBosConfigFromFastKv;
123
+ exports.fetchConfigHistory = fetchConfigHistory;
124
+ exports.fetchDeployManifests = fetchDeployManifests;
78
125
  exports.fetchRemotePluginManifest = fetchRemotePluginManifest;
79
126
  exports.getFastKvBaseUrlForNetwork = getFastKvBaseUrlForNetwork;
80
127
  exports.getRegistryNamespaceForAccount = getRegistryNamespaceForAccount;
@@ -1 +1 @@
1
- {"version":3,"file":"fastkv.cjs","names":["fetchJsonOrNull"],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_URL || \"https://kv.test.fastnear.com\"\n : process.env.REGISTRY_FASTKV_MAINNET_URL || \"https://kv.main.fastnear.com\";\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(accountId: string, gatewayId: string): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string): string {\n return accountId.endsWith(\".testnet\")\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0];\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 0 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fastkv.cjs","names":["fetchJsonOrNull"],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nconst FASTKV_TESTNET_URL = \"https://kv.test.fastnear.com\";\nconst FASTKV_MAINNET_URL = \"https://kv.main.fastnear.com\";\nconst REGISTRY_NAMESPACE_TESTNET = \"dev.allthethings.testnet\";\nconst REGISTRY_NAMESPACE_MAINNET = \"dev.everything.near\";\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string, registry?: string): string {\n return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string {\n if (registry) return registry;\n return network === \"testnet\" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0]!;\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface ConfigHistoryEntry {\n blockHeight: number;\n blockTimestampNs: string;\n txHash?: string;\n value: unknown;\n}\n\ninterface FastKvHistoryEntry {\n block_height?: number;\n block_timestamp?: string | number;\n tx_hash?: string;\n value?: unknown;\n}\n\ninterface FastKvHistoryResponse {\n entries?: Array<FastKvHistoryEntry | null>;\n}\n\nconst FASTKV_HISTORY_MAX_LIMIT = 200;\n\n/**\n * Publish history for the registry config key (atomic-deploys 11): the\n * exact-key variant of FastData's history endpoint, newest-first. The API\n * caps a page at 200 rows; a config key's write history fits well inside\n * that, so a single request is the whole story (the limit param is clamped).\n */\nexport async function fetchConfigHistory(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<ConfigHistoryEntry[]> {\n const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));\n const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url);\n const entries = (payload?.entries ?? []).filter(Boolean) as FastKvHistoryEntry[];\n\n return entries\n .map((entry) => ({\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n ...(entry.tx_hash ? { txHash: entry.tx_hash } : {}),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface DeployManifestEntry {\n key: string;\n blockHeight: number;\n blockTimestampNs: string;\n value: unknown;\n}\n\n/**\n * The per-deploy audit trail (atomic-deploys 03/12): every publish writes\n * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer\n * swap — this lists that key family newest-first via the history-by-prefix\n * endpoint.\n */\nexport async function fetchDeployManifests(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<DeployManifestEntry[]> {\n const keyPrefix = encodeURIComponent(\n `${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\\.config\\.json$/, \"\")}manifests/`,\n );\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url, {\n method: \"POST\",\n body: JSON.stringify({\n key_prefix: decodeURIComponent(keyPrefix),\n asc: false,\n limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT)),\n }),\n });\n const entries = (payload?.entries ?? []).filter(Boolean) as Array<\n FastKvHistoryEntry & { key?: string }\n >;\n\n return entries\n .map((entry) => ({\n key: entry.key ?? \"\",\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 2 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
package/dist/fastkv.d.cts CHANGED
@@ -1,16 +1,52 @@
1
1
  //#region src/fastkv.d.ts
2
2
  type NetworkId = "mainnet" | "testnet";
3
3
  declare function getFastKvBaseUrlForNetwork(network: NetworkId): string;
4
- declare function buildRegistryConfigUrl(accountId: string, gatewayId: string): string;
5
- declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string): string;
6
- declare function getRegistryNamespaceForAccount(accountId: string): string;
7
- declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
4
+ declare function buildRegistryConfigUrl(accountId: string, gatewayId: string, registry?: string): string;
5
+ declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string, registry?: string): string;
6
+ declare function getRegistryNamespaceForAccount(accountId: string, registry?: string): string;
7
+ declare function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string;
8
8
  declare function parseBosUrl(bosUrl: string): {
9
9
  accountId: string;
10
10
  gatewayId: string;
11
11
  pathSegments: string[];
12
12
  };
13
- declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
13
+ declare function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T>;
14
+ interface ConfigHistoryEntry {
15
+ blockHeight: number;
16
+ blockTimestampNs: string;
17
+ txHash?: string;
18
+ value: unknown;
19
+ }
20
+ /**
21
+ * Publish history for the registry config key (atomic-deploys 11): the
22
+ * exact-key variant of FastData's history endpoint, newest-first. The API
23
+ * caps a page at 200 rows; a config key's write history fits well inside
24
+ * that, so a single request is the whole story (the limit param is clamped).
25
+ */
26
+ declare function fetchConfigHistory(opts: {
27
+ accountId: string;
28
+ gatewayId: string;
29
+ registry?: string;
30
+ limit?: number;
31
+ }): Promise<ConfigHistoryEntry[]>;
32
+ interface DeployManifestEntry {
33
+ key: string;
34
+ blockHeight: number;
35
+ blockTimestampNs: string;
36
+ value: unknown;
37
+ }
38
+ /**
39
+ * The per-deploy audit trail (atomic-deploys 03/12): every publish writes
40
+ * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
41
+ * swap — this lists that key family newest-first via the history-by-prefix
42
+ * endpoint.
43
+ */
44
+ declare function fetchDeployManifests(opts: {
45
+ accountId: string;
46
+ gatewayId: string;
47
+ registry?: string;
48
+ limit?: number;
49
+ }): Promise<DeployManifestEntry[]>;
14
50
  interface PluginManifest {
15
51
  schemaVersion: number;
16
52
  kind: string;
@@ -38,5 +74,5 @@ interface PluginManifest {
38
74
  }
39
75
  declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
40
76
  //#endregion
41
- export { NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
77
+ export { ConfigHistoryEntry, DeployManifestEntry, NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchConfigHistory, fetchDeployManifests, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
42
78
  //# sourceMappingURL=fastkv.d.cts.map
package/dist/fastkv.d.mts CHANGED
@@ -1,16 +1,52 @@
1
1
  //#region src/fastkv.d.ts
2
2
  type NetworkId = "mainnet" | "testnet";
3
3
  declare function getFastKvBaseUrlForNetwork(network: NetworkId): string;
4
- declare function buildRegistryConfigUrl(accountId: string, gatewayId: string): string;
5
- declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string): string;
6
- declare function getRegistryNamespaceForAccount(accountId: string): string;
7
- declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
4
+ declare function buildRegistryConfigUrl(accountId: string, gatewayId: string, registry?: string): string;
5
+ declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string, registry?: string): string;
6
+ declare function getRegistryNamespaceForAccount(accountId: string, registry?: string): string;
7
+ declare function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string;
8
8
  declare function parseBosUrl(bosUrl: string): {
9
9
  accountId: string;
10
10
  gatewayId: string;
11
11
  pathSegments: string[];
12
12
  };
13
- declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
13
+ declare function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T>;
14
+ interface ConfigHistoryEntry {
15
+ blockHeight: number;
16
+ blockTimestampNs: string;
17
+ txHash?: string;
18
+ value: unknown;
19
+ }
20
+ /**
21
+ * Publish history for the registry config key (atomic-deploys 11): the
22
+ * exact-key variant of FastData's history endpoint, newest-first. The API
23
+ * caps a page at 200 rows; a config key's write history fits well inside
24
+ * that, so a single request is the whole story (the limit param is clamped).
25
+ */
26
+ declare function fetchConfigHistory(opts: {
27
+ accountId: string;
28
+ gatewayId: string;
29
+ registry?: string;
30
+ limit?: number;
31
+ }): Promise<ConfigHistoryEntry[]>;
32
+ interface DeployManifestEntry {
33
+ key: string;
34
+ blockHeight: number;
35
+ blockTimestampNs: string;
36
+ value: unknown;
37
+ }
38
+ /**
39
+ * The per-deploy audit trail (atomic-deploys 03/12): every publish writes
40
+ * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
41
+ * swap — this lists that key family newest-first via the history-by-prefix
42
+ * endpoint.
43
+ */
44
+ declare function fetchDeployManifests(opts: {
45
+ accountId: string;
46
+ gatewayId: string;
47
+ registry?: string;
48
+ limit?: number;
49
+ }): Promise<DeployManifestEntry[]>;
14
50
  interface PluginManifest {
15
51
  schemaVersion: number;
16
52
  kind: string;
@@ -38,5 +74,5 @@ interface PluginManifest {
38
74
  }
39
75
  declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
40
76
  //#endregion
41
- export { NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
77
+ export { ConfigHistoryEntry, DeployManifestEntry, NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchConfigHistory, fetchDeployManifests, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
42
78
  //# sourceMappingURL=fastkv.d.mts.map