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,267 @@
1
+ //#region src/dev-log-pipeline.ts
2
+ const ESC = "\x1B";
3
+ const BEL = "\x07";
4
+ const ANSI_RE = new RegExp(`${ESC}\\[[0-?]*[ -/]*[@-~]|${ESC}\\][^${BEL}]*${BEL}`, "g");
5
+ const stripAnsi = (input) => input.replace(ANSI_RE, "");
6
+ const LEVEL_RANK = {
7
+ error: 0,
8
+ warn: 1,
9
+ info: 2,
10
+ debug: 3
11
+ };
12
+ const LOG_LEVELS = [
13
+ "error",
14
+ "warn",
15
+ "info",
16
+ "debug"
17
+ ];
18
+ function isDebug(value) {
19
+ return value === "true" || value === "1";
20
+ }
21
+ function resolveLogLevel(env = process.env, flag) {
22
+ if (flag && LOG_LEVELS.includes(flag)) return flag;
23
+ if (env.BOS_LOG_LEVEL && LOG_LEVELS.includes(env.BOS_LOG_LEVEL)) return env.BOS_LOG_LEVEL;
24
+ if (isDebug(env.DEBUG)) return "debug";
25
+ return "warn";
26
+ }
27
+ function toEffectLogLevel(level) {
28
+ switch (level) {
29
+ case "error": return "Error";
30
+ case "warn": return "Warn";
31
+ case "info": return "Info";
32
+ case "debug": return "Debug";
33
+ }
34
+ }
35
+ const STACK_FRAME_RE = /^\s+at\s/;
36
+ const countBraces = (line) => {
37
+ let count = 0;
38
+ for (const ch of line) if (ch === "{") count += 1;
39
+ else if (ch === "}") count -= 1;
40
+ return count;
41
+ };
42
+ const makeNormalizerState = () => ({
43
+ pending: [],
44
+ openBraces: 0
45
+ });
46
+ const pushLine = (state, line) => {
47
+ state.pending.push(line);
48
+ state.openBraces = Math.max(0, state.openBraces + countBraces(line));
49
+ };
50
+ const resetState = (state) => {
51
+ state.pending = [];
52
+ state.openBraces = 0;
53
+ };
54
+ const feedLine = (state, line, meta) => {
55
+ if (state.pending.length === 0) {
56
+ state.meta = meta;
57
+ pushLine(state, line);
58
+ return null;
59
+ }
60
+ if (state.openBraces > 0 || STACK_FRAME_RE.test(line) || /^\s*\{/.test(line)) {
61
+ const closeOnBalance = state.openBraces > 0;
62
+ pushLine(state, line);
63
+ if (closeOnBalance && state.openBraces === 0) {
64
+ const completed = {
65
+ text: state.pending.join("\n"),
66
+ meta: state.meta
67
+ };
68
+ resetState(state);
69
+ return completed;
70
+ }
71
+ return null;
72
+ }
73
+ const completed = {
74
+ text: state.pending.join("\n"),
75
+ meta: state.meta
76
+ };
77
+ resetState(state);
78
+ state.meta = meta;
79
+ pushLine(state, line);
80
+ return completed;
81
+ };
82
+ const drainState = (state) => {
83
+ if (state.pending.length === 0) return null;
84
+ const completed = {
85
+ text: state.pending.join("\n"),
86
+ meta: state.meta
87
+ };
88
+ resetState(state);
89
+ return completed;
90
+ };
91
+ const WARN_RE = /(?:^|\s)WARN\b|\[WARN\]|(?:^|\s)\w*Warning:/i;
92
+ const DEBUG_RE = /(?:^|\s)DEBUG\b|\[DEBUG\]/i;
93
+ const BUILD_DIAGNOSTIC_RE = /^(?:File: |\s*[×✖]\s)/;
94
+ const EXIT_LINE_RE = /^Process exited (?:after|before) ready \((?:exit code: (\d+)|signal: ([A-Z]+))\)/;
95
+ const CLEAN_SIGNALS = /* @__PURE__ */ new Set(["SIGTERM", "SIGINT"]);
96
+ const CATEGORY_PATTERNS = [
97
+ {
98
+ category: "shutdown",
99
+ patterns: [
100
+ EXIT_LINE_RE,
101
+ /\[SIGTERM\]/i,
102
+ /shutting down/i,
103
+ /graceful shutdown/i
104
+ ]
105
+ },
106
+ {
107
+ category: "mf",
108
+ patterns: [
109
+ /\[ ?Federation Runtime ?\]/,
110
+ /\[MF\]/,
111
+ /Module Federation/i,
112
+ /Executing an Effect versioned/,
113
+ /you may want to dedupe the effect dependencies/,
114
+ /\[IntegrityMonitor\]/,
115
+ /\[Plugins\]/
116
+ ]
117
+ },
118
+ {
119
+ category: "db",
120
+ patterns: [
121
+ /\[Database\]/i,
122
+ /\bpostgres\b/i,
123
+ /\bdrizzle\b/i,
124
+ /\bpglite\b/i
125
+ ]
126
+ },
127
+ {
128
+ category: "banner",
129
+ patterns: [
130
+ /🚀|📡|📖|💚/,
131
+ /➜/,
132
+ /^[┌┐└┘│─┬┴├┤╔╗╚╝║═]/
133
+ ]
134
+ },
135
+ {
136
+ category: "build",
137
+ patterns: [
138
+ /rspack\.config\.js not found/,
139
+ /rspack|rsbuild/i,
140
+ /compiled (?:success|with|in)/i,
141
+ /built in \d+/i,
142
+ /webpack/i,
143
+ /\bHMR\b/,
144
+ /building for production/i,
145
+ BUILD_DIAGNOSTIC_RE
146
+ ]
147
+ },
148
+ {
149
+ category: "lifecycle",
150
+ patterns: [
151
+ /\bready in\b/i,
152
+ /listening (?:on|at)/i,
153
+ /server (?:is )?running/i
154
+ ]
155
+ }
156
+ ];
157
+ const classifyCategory = (text) => {
158
+ for (const { category, patterns } of CATEGORY_PATTERNS) if (patterns.some((pattern) => pattern.test(text))) return category;
159
+ return "other";
160
+ };
161
+ function classifyEvent(raw) {
162
+ const text = stripAnsi(raw.line);
163
+ const exitMatch = text.match(EXIT_LINE_RE);
164
+ const category = classifyCategory(text);
165
+ let level;
166
+ let isError = raw.isError === true;
167
+ if (exitMatch) {
168
+ if (exitMatch[2]) level = CLEAN_SIGNALS.has(exitMatch[2]) ? "info" : "error";
169
+ else level = exitMatch[1] === "0" ? "info" : "error";
170
+ isError = level === "error";
171
+ } else if (BUILD_DIAGNOSTIC_RE.test(text)) {
172
+ level = "error";
173
+ isError = true;
174
+ } else if (WARN_RE.test(text)) {
175
+ level = "warn";
176
+ isError = false;
177
+ } else if (DEBUG_RE.test(text)) {
178
+ level = "debug";
179
+ isError = false;
180
+ } else if (isError) level = "error";
181
+ else level = "info";
182
+ return {
183
+ timestamp: raw.timestamp ?? Date.now(),
184
+ source: raw.source,
185
+ line: text,
186
+ isError,
187
+ level,
188
+ category
189
+ };
190
+ }
191
+ function passesLevel(event, level) {
192
+ return LEVEL_RANK[event.level] <= LEVEL_RANK[level];
193
+ }
194
+ var DbCollapser = class {
195
+ runs = /* @__PURE__ */ new Set();
196
+ feed(event) {
197
+ if (event.category === "db" && event.level !== "error") {
198
+ if (!this.runs.has(event.source)) {
199
+ this.runs.add(event.source);
200
+ return {
201
+ ...event,
202
+ line: "db ready",
203
+ isError: false,
204
+ level: "info",
205
+ collapsed: true
206
+ };
207
+ }
208
+ return null;
209
+ }
210
+ this.runs.delete(event.source);
211
+ return {
212
+ ...event,
213
+ collapsed: false
214
+ };
215
+ }
216
+ };
217
+ function createLogPipeline(options) {
218
+ const level = options.level ?? resolveLogLevel();
219
+ const sinks = options.sinks;
220
+ const normalizers = /* @__PURE__ */ new Map();
221
+ const collapser = new DbCollapser();
222
+ const stateFor = (source) => {
223
+ let state = normalizers.get(source);
224
+ if (!state) {
225
+ state = makeNormalizerState();
226
+ normalizers.set(source, state);
227
+ }
228
+ return state;
229
+ };
230
+ const emit = (meta, text) => {
231
+ const event = classifyEvent({
232
+ source: meta.source,
233
+ line: text,
234
+ isError: meta.isError,
235
+ timestamp: meta.timestamp
236
+ });
237
+ sinks.file(event);
238
+ if (!passesLevel(event, level)) return;
239
+ const collapsed = collapser.feed(event);
240
+ if (!collapsed) return;
241
+ sinks.export(collapsed);
242
+ sinks.display(collapsed);
243
+ };
244
+ return {
245
+ ingest: (raw) => {
246
+ const clean = stripAnsi(raw.line);
247
+ if (!clean.trim()) return;
248
+ const state = stateFor(raw.source);
249
+ const completed = feedLine(state, clean, {
250
+ source: raw.source,
251
+ isError: raw.isError,
252
+ timestamp: raw.timestamp
253
+ });
254
+ if (completed !== null) emit(completed.meta, completed.text);
255
+ },
256
+ flush: () => {
257
+ for (const state of normalizers.values()) {
258
+ const completed = drainState(state);
259
+ if (completed !== null) emit(completed.meta, completed.text);
260
+ }
261
+ }
262
+ };
263
+ }
264
+
265
+ //#endregion
266
+ export { classifyEvent, createLogPipeline, isDebug, passesLevel, resolveLogLevel, stripAnsi, toEffectLogLevel };
267
+ //# sourceMappingURL=dev-log-pipeline.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-log-pipeline.mjs","names":[],"sources":["../src/dev-log-pipeline.ts"],"sourcesContent":["const ESC = \"\\x1b\";\nconst BEL = \"\\x07\";\nconst ANSI_RE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}]*${BEL}`, \"g\");\n\nexport const stripAnsi = (input: string): string => input.replace(ANSI_RE, \"\");\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type LogCategory = \"banner\" | \"build\" | \"db\" | \"mf\" | \"lifecycle\" | \"shutdown\" | \"other\";\n\nexport interface RawLogLine {\n source: string;\n line: string;\n isError?: boolean;\n timestamp?: number;\n}\n\nexport interface LogEvent {\n timestamp: number;\n source: string;\n line: string;\n isError: boolean;\n level: LogLevel;\n category: LogCategory;\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = { error: 0, warn: 1, info: 2, debug: 3 };\n\nconst LOG_LEVELS: readonly LogLevel[] = [\"error\", \"warn\", \"info\", \"debug\"];\n\nexport interface LogLevelEnv {\n BOS_LOG_LEVEL?: string;\n DEBUG?: string;\n}\n\nexport function isDebug(value: string | undefined): boolean {\n return value === \"true\" || value === \"1\";\n}\n\nexport function resolveLogLevel(\n env: LogLevelEnv = process.env as LogLevelEnv,\n flag?: string,\n): LogLevel {\n if (flag && (LOG_LEVELS as readonly string[]).includes(flag)) return flag as LogLevel;\n if (env.BOS_LOG_LEVEL && (LOG_LEVELS as readonly string[]).includes(env.BOS_LOG_LEVEL)) {\n return env.BOS_LOG_LEVEL as LogLevel;\n }\n if (isDebug(env.DEBUG)) return \"debug\";\n return \"warn\";\n}\n\nexport type EffectLogLevel = \"Error\" | \"Warn\" | \"Info\" | \"Debug\";\n\nexport function toEffectLogLevel(level: LogLevel): EffectLogLevel {\n switch (level) {\n case \"error\":\n return \"Error\";\n case \"warn\":\n return \"Warn\";\n case \"info\":\n return \"Info\";\n case \"debug\":\n return \"Debug\";\n }\n}\n\nconst STACK_FRAME_RE = /^\\s+at\\s/;\n\nconst countBraces = (line: string): number => {\n let count = 0;\n for (const ch of line) {\n if (ch === \"{\") count += 1;\n else if (ch === \"}\") count -= 1;\n }\n return count;\n};\n\ninterface PendingMeta {\n source: string;\n isError?: boolean;\n timestamp?: number;\n}\n\ninterface NormalizerState {\n pending: string[];\n openBraces: number;\n meta?: PendingMeta;\n}\n\nconst makeNormalizerState = (): NormalizerState => ({ pending: [], openBraces: 0 });\n\nconst pushLine = (state: NormalizerState, line: string) => {\n state.pending.push(line);\n state.openBraces = Math.max(0, state.openBraces + countBraces(line));\n};\n\nconst resetState = (state: NormalizerState) => {\n state.pending = [];\n state.openBraces = 0;\n};\n\ninterface CompletedEvent {\n text: string;\n meta: PendingMeta;\n}\n\nconst feedLine = (\n state: NormalizerState,\n line: string,\n meta: PendingMeta,\n): CompletedEvent | null => {\n if (state.pending.length === 0) {\n state.meta = meta;\n pushLine(state, line);\n return null;\n }\n\n const isContinuation = state.openBraces > 0 || STACK_FRAME_RE.test(line) || /^\\s*\\{/.test(line);\n\n if (isContinuation) {\n const closeOnBalance = state.openBraces > 0;\n pushLine(state, line);\n if (closeOnBalance && state.openBraces === 0) {\n const completed = { text: state.pending.join(\"\\n\"), meta: state.meta! };\n resetState(state);\n return completed;\n }\n return null;\n }\n\n const completed = { text: state.pending.join(\"\\n\"), meta: state.meta! };\n resetState(state);\n state.meta = meta;\n pushLine(state, line);\n return completed;\n};\n\nconst drainState = (state: NormalizerState): CompletedEvent | null => {\n if (state.pending.length === 0) return null;\n const completed = { text: state.pending.join(\"\\n\"), meta: state.meta! };\n resetState(state);\n return completed;\n};\n\nexport function normalizeLines(lines: string[]): string[] {\n const state = makeNormalizerState();\n const events: string[] = [];\n for (const line of lines) {\n const completed = feedLine(state, line, { source: \"\" });\n if (completed !== null) events.push(completed.text);\n }\n const last = drainState(state);\n if (last !== null) events.push(last.text);\n return events;\n}\n\nconst WARN_RE = /(?:^|\\s)WARN\\b|\\[WARN\\]|(?:^|\\s)\\w*Warning:/i;\nconst DEBUG_RE = /(?:^|\\s)DEBUG\\b|\\[DEBUG\\]/i;\n\n// rspack/rsbuild write the \"Build error:\" title to stderr with an empty\n// message and the actual diagnostics (`File: …`, `× …`) to stdout. Promote\n// those diagnostic lines so they pass the default warn display filter.\nconst BUILD_DIAGNOSTIC_RE = /^(?:File: |\\s*[×✖]\\s)/;\n\nconst EXIT_LINE_RE =\n /^Process exited (?:after|before) ready \\((?:exit code: (\\d+)|signal: ([A-Z]+))\\)/;\n\nconst CLEAN_SIGNALS = new Set([\"SIGTERM\", \"SIGINT\"]);\n\nconst CATEGORY_PATTERNS: Array<{ category: LogCategory; patterns: RegExp[] }> = [\n {\n category: \"shutdown\",\n patterns: [EXIT_LINE_RE, /\\[SIGTERM\\]/i, /shutting down/i, /graceful shutdown/i],\n },\n {\n category: \"mf\",\n patterns: [\n /\\[ ?Federation Runtime ?\\]/,\n /\\[MF\\]/,\n /Module Federation/i,\n /Executing an Effect versioned/,\n /you may want to dedupe the effect dependencies/,\n /\\[IntegrityMonitor\\]/,\n /\\[Plugins\\]/,\n ],\n },\n {\n category: \"db\",\n patterns: [/\\[Database\\]/i, /\\bpostgres\\b/i, /\\bdrizzle\\b/i, /\\bpglite\\b/i],\n },\n {\n category: \"banner\",\n patterns: [/🚀|📡|📖|💚/, /➜/, /^[┌┐└┘│─┬┴├┤╔╗╚╝║═]/],\n },\n {\n category: \"build\",\n patterns: [\n /rspack\\.config\\.js not found/,\n /rspack|rsbuild/i,\n /compiled (?:success|with|in)/i,\n /built in \\d+/i,\n /webpack/i,\n /\\bHMR\\b/,\n /building for production/i,\n BUILD_DIAGNOSTIC_RE,\n ],\n },\n {\n category: \"lifecycle\",\n patterns: [/\\bready in\\b/i, /listening (?:on|at)/i, /server (?:is )?running/i],\n },\n];\n\nconst classifyCategory = (text: string): LogCategory => {\n for (const { category, patterns } of CATEGORY_PATTERNS) {\n if (patterns.some((pattern) => pattern.test(text))) return category;\n }\n return \"other\";\n};\n\nexport function classifyEvent(raw: RawLogLine): LogEvent {\n const text = stripAnsi(raw.line);\n const exitMatch = text.match(EXIT_LINE_RE);\n const category = classifyCategory(text);\n\n let level: LogLevel;\n let isError = raw.isError === true;\n\n if (exitMatch) {\n if (exitMatch[2]) {\n level = CLEAN_SIGNALS.has(exitMatch[2]) ? \"info\" : \"error\";\n } else {\n level = exitMatch[1] === \"0\" ? \"info\" : \"error\";\n }\n isError = level === \"error\";\n } else if (BUILD_DIAGNOSTIC_RE.test(text)) {\n level = \"error\";\n isError = true;\n } else if (WARN_RE.test(text)) {\n level = \"warn\";\n isError = false;\n } else if (DEBUG_RE.test(text)) {\n level = \"debug\";\n isError = false;\n } else if (isError) {\n level = \"error\";\n } else {\n level = \"info\";\n }\n\n return {\n timestamp: raw.timestamp ?? Date.now(),\n source: raw.source,\n line: text,\n isError,\n level,\n category,\n };\n}\n\nexport function passesLevel(event: LogEvent, level: LogLevel): boolean {\n return LEVEL_RANK[event.level] <= LEVEL_RANK[level];\n}\n\nexport interface CollapsedDbEvent extends LogEvent {\n collapsed: boolean;\n}\n\nclass DbCollapser {\n private runs = new Set<string>();\n\n feed(event: LogEvent): CollapsedDbEvent | null {\n if (event.category === \"db\" && event.level !== \"error\") {\n if (!this.runs.has(event.source)) {\n this.runs.add(event.source);\n return { ...event, line: \"db ready\", isError: false, level: \"info\", collapsed: true };\n }\n return null;\n }\n this.runs.delete(event.source);\n return { ...event, collapsed: false };\n }\n}\n\nexport interface LogPipelineSinks {\n display: (event: LogEvent) => void;\n file: (event: LogEvent) => void;\n export: (event: LogEvent) => void;\n}\n\nexport interface LogPipeline {\n ingest: (raw: RawLogLine) => void;\n flush: () => void;\n}\n\nexport function createLogPipeline(options: {\n level?: LogLevel;\n sinks: LogPipelineSinks;\n}): LogPipeline {\n const level = options.level ?? resolveLogLevel();\n const sinks = options.sinks;\n const normalizers = new Map<string, NormalizerState>();\n const collapser = new DbCollapser();\n\n const stateFor = (source: string): NormalizerState => {\n let state = normalizers.get(source);\n if (!state) {\n state = makeNormalizerState();\n normalizers.set(source, state);\n }\n return state;\n };\n\n const emit = (meta: PendingMeta, text: string) => {\n const event = classifyEvent({\n source: meta.source,\n line: text,\n isError: meta.isError,\n timestamp: meta.timestamp,\n });\n sinks.file(event);\n if (!passesLevel(event, level)) return;\n const collapsed = collapser.feed(event);\n if (!collapsed) return;\n sinks.export(collapsed);\n sinks.display(collapsed);\n };\n\n return {\n ingest: (raw) => {\n const clean = stripAnsi(raw.line);\n if (!clean.trim()) return;\n const state = stateFor(raw.source);\n const completed = feedLine(state, clean, {\n source: raw.source,\n isError: raw.isError,\n timestamp: raw.timestamp,\n });\n if (completed !== null) emit(completed.meta, completed.text);\n },\n flush: () => {\n for (const state of normalizers.values()) {\n const completed = drainState(state);\n if (completed !== null) emit(completed.meta, completed.text);\n }\n },\n };\n}\n"],"mappings":"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"}
package/dist/dev-logs.cjs CHANGED
@@ -1,12 +1,9 @@
1
+ const require_dev_log_pipeline = require('./dev-log-pipeline.cjs');
1
2
  let node_fs = require("node:fs");
2
3
  let node_path = require("node:path");
3
4
  let node_fs_promises = require("node:fs/promises");
4
5
 
5
6
  //#region src/dev-logs.ts
6
- const ESC = "\x1B";
7
- const BEL = "\x07";
8
- const ANSI_RE = new RegExp(`${ESC}\\[[0-?]*[ -/]*[@-~]|${ESC}\\][^${BEL}]*${BEL}`, "g");
9
- const stripAnsi = (input) => input.replace(ANSI_RE, "");
10
7
  function getBosDir(configDir) {
11
8
  return (0, node_path.join)(configDir, ".bos");
12
9
  }
@@ -16,15 +13,19 @@ function getLogsDir(configDir) {
16
13
  function formatLogLine(entry) {
17
14
  const ts = new Date(entry.timestamp).toISOString();
18
15
  const prefix = entry.isError ? "ERR" : "OUT";
19
- const clean = stripAnsi(entry.line);
20
- return `[${ts}] [${entry.source}] [${prefix}] ${clean}`;
16
+ const clean = require_dev_log_pipeline.stripAnsi(entry.line);
17
+ const head = `[${ts}] [${entry.source}] [${prefix}] `;
18
+ const pad = " ".repeat(head.length);
19
+ const [first, ...rest] = clean.split("\n");
20
+ return [`${head}${first}`, ...rest.map((line) => `${pad}${line}`)].join("\n");
21
21
  }
22
22
  async function createDevLogger(configDir, description) {
23
23
  const dir = getLogsDir(configDir);
24
24
  if (!(0, node_fs.existsSync)(dir)) await (0, node_fs_promises.mkdir)(dir, { recursive: true });
25
25
  const now = /* @__PURE__ */ new Date();
26
- const logFile = (0, node_path.join)(dir, `dev-${now.toISOString().replace(/[:.]/g, "-").slice(0, 19)}.log`);
27
- const latestFile = (0, node_path.join)(dir, "dev-latest.log");
26
+ const ts = now.toISOString().replace(/[:.]/g, "-").slice(0, 19);
27
+ const logFile = (0, node_path.join)(dir, `dev-${ts}-${process.pid}.log`);
28
+ const latestFile = (0, node_path.join)(dir, `dev-latest-${process.pid}.log`);
28
29
  const header = `# everything-dev dev session: ${description}\n# Started: ${now.toISOString()}\n\n`;
29
30
  await (0, node_fs_promises.writeFile)(logFile, header, "utf8");
30
31
  await (0, node_fs_promises.writeFile)(latestFile, header, "utf8");
@@ -50,9 +51,39 @@ async function createDevLogger(configDir, description) {
50
51
  }
51
52
  };
52
53
  }
54
+ function resolveDevLatestFile(configDir) {
55
+ const dir = getLogsDir(configDir);
56
+ const latestFile = (0, node_path.join)(dir, "dev-latest.log");
57
+ if ((0, node_fs.existsSync)(latestFile)) return latestFile;
58
+ const STARTED_RE = /^# Started: (.+)$/m;
59
+ const startedMsOf = (name) => {
60
+ const header = (0, node_fs.readFileSync)((0, node_path.join)(dir, name), "utf8").slice(0, 256);
61
+ const started = STARTED_RE.exec(header)?.[1];
62
+ const parsed = started ? Date.parse(started) : NaN;
63
+ return Number.isNaN(parsed) ? (0, node_fs.statSync)((0, node_path.join)(dir, name)).mtimeMs : parsed;
64
+ };
65
+ const pidOf = (name) => Number(/^dev-latest-(\d+)\.log$/.exec(name)?.[1] ?? 0);
66
+ const candidates = (0, node_fs.readdirSync)(dir).filter((name) => /^dev-latest-\d+\.log$/.test(name)).map((name) => ({
67
+ name,
68
+ startedMs: startedMsOf(name),
69
+ pid: pidOf(name)
70
+ })).sort((a, b) => b.startedMs - a.startedMs || b.pid - a.pid || a.name.localeCompare(b.name));
71
+ return candidates.length > 0 ? (0, node_path.join)(dir, candidates[0].name) : latestFile;
72
+ }
73
+ async function readDevLatestLog(configDir, opts) {
74
+ const latestFile = resolveDevLatestFile(configDir);
75
+ const text = await (0, node_fs_promises.readFile)(latestFile, "utf8").catch(() => "");
76
+ const tail = opts?.tail;
77
+ if (!tail || tail <= 0) return text;
78
+ const lines = text.split("\n");
79
+ return lines.slice(Math.max(0, lines.length - tail)).join("\n");
80
+ }
53
81
 
54
82
  //#endregion
55
83
  exports.createDevLogger = createDevLogger;
84
+ exports.formatLogLine = formatLogLine;
56
85
  exports.getBosDir = getBosDir;
57
86
  exports.getLogsDir = getLogsDir;
87
+ exports.readDevLatestLog = readDevLatestLog;
88
+ exports.resolveDevLatestFile = resolveDevLatestFile;
58
89
  //# sourceMappingURL=dev-logs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-logs.cjs","names":[],"sources":["../src/dev-logs.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst ESC = \"\\x1b\";\nconst BEL = \"\\x07\";\nconst ANSI_RE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}]*${BEL}`, \"g\");\n\nconst stripAnsi = (input: string): string => input.replace(ANSI_RE, \"\");\n\nexport interface LogEntry {\n timestamp: number;\n source: string;\n line: string;\n isError?: boolean;\n}\n\nexport interface DevLogger {\n logFile: string;\n latestFile: string;\n write: (entry: LogEntry) => Promise<void>;\n readLatest: (opts?: { tail?: number }) => Promise<string>;\n}\n\nexport function getBosDir(configDir: string): string {\n return join(configDir, \".bos\");\n}\n\nexport function getLogsDir(configDir: string): string {\n return join(getBosDir(configDir), \"logs\");\n}\n\nfunction formatLogLine(entry: LogEntry): string {\n const ts = new Date(entry.timestamp).toISOString();\n const prefix = entry.isError ? \"ERR\" : \"OUT\";\n const clean = stripAnsi(entry.line);\n return `[${ts}] [${entry.source}] [${prefix}] ${clean}`;\n}\n\nexport async function createDevLogger(configDir: string, description: string): Promise<DevLogger> {\n const dir = getLogsDir(configDir);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const now = new Date();\n const ts = now.toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const logFile = join(dir, `dev-${ts}.log`);\n const latestFile = join(dir, \"dev-latest.log\");\n\n const header =\n `# everything-dev dev session: ${description}\\n` + `# Started: ${now.toISOString()}\\n\\n`;\n // Overwrite each run so dev-latest.log is always actionable.\n await writeFile(logFile, header, \"utf8\");\n await writeFile(latestFile, header, \"utf8\");\n\n let chain = Promise.resolve();\n const enqueue = (fn: () => Promise<void>) => {\n chain = chain.then(fn, fn);\n return chain;\n };\n\n return {\n logFile,\n latestFile,\n write: (entry) =>\n enqueue(async () => {\n const line = `${formatLogLine(entry)}\\n`;\n await appendFile(logFile, line);\n await appendFile(latestFile, line);\n }),\n readLatest: async (opts) => {\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n },\n };\n}\n\nexport async function readDevLatestLog(\n configDir: string,\n opts?: { tail?: number },\n): Promise<string> {\n const latestFile = join(getLogsDir(configDir), \"dev-latest.log\");\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n}\n"],"mappings":";;;;;AAIA,MAAM,MAAM;AACZ,MAAM,MAAM;AACZ,MAAM,UAAU,IAAI,OAAO,GAAG,IAAI,uBAAuB,IAAI,OAAO,IAAI,IAAI,OAAO,GAAG;AAEtF,MAAM,aAAa,UAA0B,MAAM,QAAQ,SAAS,EAAE;AAgBtE,SAAgB,UAAU,WAA2B;CACnD,2BAAY,WAAW,MAAM;AAC/B;AAEA,SAAgB,WAAW,WAA2B;CACpD,2BAAY,UAAU,SAAS,GAAG,MAAM;AAC1C;AAEA,SAAS,cAAc,OAAyB;CAC9C,MAAM,KAAK,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC,YAAY;CACjD,MAAM,SAAS,MAAM,UAAU,QAAQ;CACvC,MAAM,QAAQ,UAAU,MAAM,IAAI;CAClC,OAAO,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,OAAO,IAAI;AAClD;AAEA,eAAsB,gBAAgB,WAAmB,aAAyC;CAChG,MAAM,MAAM,WAAW,SAAS;CAChC,IAAI,yBAAY,GAAG,GACjB,kCAAY,KAAK,EAAE,WAAW,KAAK,CAAC;CAGtC,MAAM,sBAAM,IAAI,KAAK;CAErB,MAAM,8BAAe,KAAK,OADf,IAAI,YAAY,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,CAAC,MAAM,GAAG,EAC1B,EAAE,KAAK;CACzC,MAAM,iCAAkB,KAAK,gBAAgB;CAE7C,MAAM,SACJ,iCAAiC,YAAY,eAAoB,IAAI,YAAY,EAAE;CAErF,sCAAgB,SAAS,QAAQ,MAAM;CACvC,sCAAgB,YAAY,QAAQ,MAAM;CAE1C,IAAI,QAAQ,QAAQ,QAAQ;CAC5B,MAAM,WAAW,OAA4B;EAC3C,QAAQ,MAAM,KAAK,IAAI,EAAE;EACzB,OAAO;CACT;CAEA,OAAO;EACL;EACA;EACA,QAAQ,UACN,QAAQ,YAAY;GAClB,MAAM,OAAO,GAAG,cAAc,KAAK,EAAE;GACrC,uCAAiB,SAAS,IAAI;GAC9B,uCAAiB,YAAY,IAAI;EACnC,CAAC;EACH,YAAY,OAAO,SAAS;GAC1B,MAAM,OAAO,qCAAe,YAAY,MAAM,CAAC,CAAC,YAAY,EAAE;GAC9D,MAAM,OAAO,MAAM;GACnB,IAAI,CAAC,QAAQ,QAAQ,GAAG,OAAO;GAC/B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,OAAO,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;EAChE;CACF;AACF"}
1
+ {"version":3,"file":"dev-logs.cjs","names":["join","stripAnsi","existsSync","mkdir","writeFile","appendFile","readFile","readFileSync","statSync","readdirSync"],"sources":["../src/dev-logs.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"./dev-log-pipeline\";\n\nexport interface LogEntry {\n timestamp: number;\n source: string;\n line: string;\n isError?: boolean;\n}\n\nexport interface DevLogger {\n logFile: string;\n latestFile: string;\n write: (entry: LogEntry) => Promise<void>;\n readLatest: (opts?: { tail?: number }) => Promise<string>;\n}\n\nexport function getBosDir(configDir: string): string {\n return join(configDir, \".bos\");\n}\n\nexport function getLogsDir(configDir: string): string {\n return join(getBosDir(configDir), \"logs\");\n}\n\nexport function formatLogLine(entry: LogEntry): string {\n const ts = new Date(entry.timestamp).toISOString();\n const prefix = entry.isError ? \"ERR\" : \"OUT\";\n const clean = stripAnsi(entry.line);\n const head = `[${ts}] [${entry.source}] [${prefix}] `;\n const pad = \" \".repeat(head.length);\n const [first, ...rest] = clean.split(\"\\n\");\n return [`${head}${first}`, ...rest.map((line) => `${pad}${line}`)].join(\"\\n\");\n}\n\nexport async function createDevLogger(configDir: string, description: string): Promise<DevLogger> {\n const dir = getLogsDir(configDir);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const now = new Date();\n const ts = now.toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const logFile = join(dir, `dev-${ts}-${process.pid}.log`);\n const latestFile = join(dir, `dev-latest-${process.pid}.log`);\n\n const header =\n `# everything-dev dev session: ${description}\\n` + `# Started: ${now.toISOString()}\\n\\n`;\n // Overwrite each run so dev-latest.log is always actionable.\n await writeFile(logFile, header, \"utf8\");\n await writeFile(latestFile, header, \"utf8\");\n\n let chain = Promise.resolve();\n const enqueue = (fn: () => Promise<void>) => {\n chain = chain.then(fn, fn);\n return chain;\n };\n\n return {\n logFile,\n latestFile,\n write: (entry) =>\n enqueue(async () => {\n const line = `${formatLogLine(entry)}\\n`;\n await appendFile(logFile, line);\n await appendFile(latestFile, line);\n }),\n readLatest: async (opts) => {\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n },\n };\n}\n\nexport function resolveDevLatestFile(configDir: string): string {\n const dir = getLogsDir(configDir);\n const latestFile = join(dir, \"dev-latest.log\");\n if (existsSync(latestFile)) return latestFile;\n const STARTED_RE = /^# Started: (.+)$/m;\n const startedMsOf = (name: string): number => {\n const header = readFileSync(join(dir, name), \"utf8\").slice(0, 256);\n const started = STARTED_RE.exec(header)?.[1];\n const parsed = started ? Date.parse(started) : NaN;\n return Number.isNaN(parsed) ? statSync(join(dir, name)).mtimeMs : parsed;\n };\n const pidOf = (name: string): number => Number(/^dev-latest-(\\d+)\\.log$/.exec(name)?.[1] ?? 0);\n const candidates = readdirSync(dir)\n .filter((name) => /^dev-latest-\\d+\\.log$/.test(name))\n .map((name) => ({ name, startedMs: startedMsOf(name), pid: pidOf(name) }))\n .sort((a, b) => b.startedMs - a.startedMs || b.pid - a.pid || a.name.localeCompare(b.name));\n return candidates.length > 0 ? join(dir, candidates[0]!.name) : latestFile;\n}\n\nexport async function readDevLatestLog(\n configDir: string,\n opts?: { tail?: number },\n): Promise<string> {\n const latestFile = resolveDevLatestFile(configDir);\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n}\n"],"mappings":"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"}
package/dist/dev-logs.mjs CHANGED
@@ -1,12 +1,9 @@
1
- import { existsSync } from "node:fs";
1
+ import { stripAnsi } from "./dev-log-pipeline.mjs";
2
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
4
5
 
5
6
  //#region src/dev-logs.ts
6
- const ESC = "\x1B";
7
- const BEL = "\x07";
8
- const ANSI_RE = new RegExp(`${ESC}\\[[0-?]*[ -/]*[@-~]|${ESC}\\][^${BEL}]*${BEL}`, "g");
9
- const stripAnsi = (input) => input.replace(ANSI_RE, "");
10
7
  function getBosDir(configDir) {
11
8
  return join(configDir, ".bos");
12
9
  }
@@ -17,14 +14,18 @@ function formatLogLine(entry) {
17
14
  const ts = new Date(entry.timestamp).toISOString();
18
15
  const prefix = entry.isError ? "ERR" : "OUT";
19
16
  const clean = stripAnsi(entry.line);
20
- return `[${ts}] [${entry.source}] [${prefix}] ${clean}`;
17
+ const head = `[${ts}] [${entry.source}] [${prefix}] `;
18
+ const pad = " ".repeat(head.length);
19
+ const [first, ...rest] = clean.split("\n");
20
+ return [`${head}${first}`, ...rest.map((line) => `${pad}${line}`)].join("\n");
21
21
  }
22
22
  async function createDevLogger(configDir, description) {
23
23
  const dir = getLogsDir(configDir);
24
24
  if (!existsSync(dir)) await mkdir(dir, { recursive: true });
25
25
  const now = /* @__PURE__ */ new Date();
26
- const logFile = join(dir, `dev-${now.toISOString().replace(/[:.]/g, "-").slice(0, 19)}.log`);
27
- const latestFile = join(dir, "dev-latest.log");
26
+ const ts = now.toISOString().replace(/[:.]/g, "-").slice(0, 19);
27
+ const logFile = join(dir, `dev-${ts}-${process.pid}.log`);
28
+ const latestFile = join(dir, `dev-latest-${process.pid}.log`);
28
29
  const header = `# everything-dev dev session: ${description}\n# Started: ${now.toISOString()}\n\n`;
29
30
  await writeFile(logFile, header, "utf8");
30
31
  await writeFile(latestFile, header, "utf8");
@@ -50,7 +51,34 @@ async function createDevLogger(configDir, description) {
50
51
  }
51
52
  };
52
53
  }
54
+ function resolveDevLatestFile(configDir) {
55
+ const dir = getLogsDir(configDir);
56
+ const latestFile = join(dir, "dev-latest.log");
57
+ if (existsSync(latestFile)) return latestFile;
58
+ const STARTED_RE = /^# Started: (.+)$/m;
59
+ const startedMsOf = (name) => {
60
+ const header = readFileSync(join(dir, name), "utf8").slice(0, 256);
61
+ const started = STARTED_RE.exec(header)?.[1];
62
+ const parsed = started ? Date.parse(started) : NaN;
63
+ return Number.isNaN(parsed) ? statSync(join(dir, name)).mtimeMs : parsed;
64
+ };
65
+ const pidOf = (name) => Number(/^dev-latest-(\d+)\.log$/.exec(name)?.[1] ?? 0);
66
+ const candidates = readdirSync(dir).filter((name) => /^dev-latest-\d+\.log$/.test(name)).map((name) => ({
67
+ name,
68
+ startedMs: startedMsOf(name),
69
+ pid: pidOf(name)
70
+ })).sort((a, b) => b.startedMs - a.startedMs || b.pid - a.pid || a.name.localeCompare(b.name));
71
+ return candidates.length > 0 ? join(dir, candidates[0].name) : latestFile;
72
+ }
73
+ async function readDevLatestLog(configDir, opts) {
74
+ const latestFile = resolveDevLatestFile(configDir);
75
+ const text = await readFile(latestFile, "utf8").catch(() => "");
76
+ const tail = opts?.tail;
77
+ if (!tail || tail <= 0) return text;
78
+ const lines = text.split("\n");
79
+ return lines.slice(Math.max(0, lines.length - tail)).join("\n");
80
+ }
53
81
 
54
82
  //#endregion
55
- export { createDevLogger, getBosDir, getLogsDir };
83
+ export { createDevLogger, formatLogLine, getBosDir, getLogsDir, readDevLatestLog, resolveDevLatestFile };
56
84
  //# sourceMappingURL=dev-logs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-logs.mjs","names":[],"sources":["../src/dev-logs.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst ESC = \"\\x1b\";\nconst BEL = \"\\x07\";\nconst ANSI_RE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}]*${BEL}`, \"g\");\n\nconst stripAnsi = (input: string): string => input.replace(ANSI_RE, \"\");\n\nexport interface LogEntry {\n timestamp: number;\n source: string;\n line: string;\n isError?: boolean;\n}\n\nexport interface DevLogger {\n logFile: string;\n latestFile: string;\n write: (entry: LogEntry) => Promise<void>;\n readLatest: (opts?: { tail?: number }) => Promise<string>;\n}\n\nexport function getBosDir(configDir: string): string {\n return join(configDir, \".bos\");\n}\n\nexport function getLogsDir(configDir: string): string {\n return join(getBosDir(configDir), \"logs\");\n}\n\nfunction formatLogLine(entry: LogEntry): string {\n const ts = new Date(entry.timestamp).toISOString();\n const prefix = entry.isError ? \"ERR\" : \"OUT\";\n const clean = stripAnsi(entry.line);\n return `[${ts}] [${entry.source}] [${prefix}] ${clean}`;\n}\n\nexport async function createDevLogger(configDir: string, description: string): Promise<DevLogger> {\n const dir = getLogsDir(configDir);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const now = new Date();\n const ts = now.toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const logFile = join(dir, `dev-${ts}.log`);\n const latestFile = join(dir, \"dev-latest.log\");\n\n const header =\n `# everything-dev dev session: ${description}\\n` + `# Started: ${now.toISOString()}\\n\\n`;\n // Overwrite each run so dev-latest.log is always actionable.\n await writeFile(logFile, header, \"utf8\");\n await writeFile(latestFile, header, \"utf8\");\n\n let chain = Promise.resolve();\n const enqueue = (fn: () => Promise<void>) => {\n chain = chain.then(fn, fn);\n return chain;\n };\n\n return {\n logFile,\n latestFile,\n write: (entry) =>\n enqueue(async () => {\n const line = `${formatLogLine(entry)}\\n`;\n await appendFile(logFile, line);\n await appendFile(latestFile, line);\n }),\n readLatest: async (opts) => {\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n },\n };\n}\n\nexport async function readDevLatestLog(\n configDir: string,\n opts?: { tail?: number },\n): Promise<string> {\n const latestFile = join(getLogsDir(configDir), \"dev-latest.log\");\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n}\n"],"mappings":";;;;;AAIA,MAAM,MAAM;AACZ,MAAM,MAAM;AACZ,MAAM,UAAU,IAAI,OAAO,GAAG,IAAI,uBAAuB,IAAI,OAAO,IAAI,IAAI,OAAO,GAAG;AAEtF,MAAM,aAAa,UAA0B,MAAM,QAAQ,SAAS,EAAE;AAgBtE,SAAgB,UAAU,WAA2B;CACnD,OAAO,KAAK,WAAW,MAAM;AAC/B;AAEA,SAAgB,WAAW,WAA2B;CACpD,OAAO,KAAK,UAAU,SAAS,GAAG,MAAM;AAC1C;AAEA,SAAS,cAAc,OAAyB;CAC9C,MAAM,KAAK,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC,YAAY;CACjD,MAAM,SAAS,MAAM,UAAU,QAAQ;CACvC,MAAM,QAAQ,UAAU,MAAM,IAAI;CAClC,OAAO,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,OAAO,IAAI;AAClD;AAEA,eAAsB,gBAAgB,WAAmB,aAAyC;CAChG,MAAM,MAAM,WAAW,SAAS;CAChC,IAAI,CAAC,WAAW,GAAG,GACjB,MAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;CAGtC,MAAM,sBAAM,IAAI,KAAK;CAErB,MAAM,UAAU,KAAK,KAAK,OADf,IAAI,YAAY,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,CAAC,MAAM,GAAG,EAC1B,EAAE,KAAK;CACzC,MAAM,aAAa,KAAK,KAAK,gBAAgB;CAE7C,MAAM,SACJ,iCAAiC,YAAY,eAAoB,IAAI,YAAY,EAAE;CAErF,MAAM,UAAU,SAAS,QAAQ,MAAM;CACvC,MAAM,UAAU,YAAY,QAAQ,MAAM;CAE1C,IAAI,QAAQ,QAAQ,QAAQ;CAC5B,MAAM,WAAW,OAA4B;EAC3C,QAAQ,MAAM,KAAK,IAAI,EAAE;EACzB,OAAO;CACT;CAEA,OAAO;EACL;EACA;EACA,QAAQ,UACN,QAAQ,YAAY;GAClB,MAAM,OAAO,GAAG,cAAc,KAAK,EAAE;GACrC,MAAM,WAAW,SAAS,IAAI;GAC9B,MAAM,WAAW,YAAY,IAAI;EACnC,CAAC;EACH,YAAY,OAAO,SAAS;GAC1B,MAAM,OAAO,MAAM,SAAS,YAAY,MAAM,CAAC,CAAC,YAAY,EAAE;GAC9D,MAAM,OAAO,MAAM;GACnB,IAAI,CAAC,QAAQ,QAAQ,GAAG,OAAO;GAC/B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,OAAO,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;EAChE;CACF;AACF"}
1
+ {"version":3,"file":"dev-logs.mjs","names":[],"sources":["../src/dev-logs.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"./dev-log-pipeline\";\n\nexport interface LogEntry {\n timestamp: number;\n source: string;\n line: string;\n isError?: boolean;\n}\n\nexport interface DevLogger {\n logFile: string;\n latestFile: string;\n write: (entry: LogEntry) => Promise<void>;\n readLatest: (opts?: { tail?: number }) => Promise<string>;\n}\n\nexport function getBosDir(configDir: string): string {\n return join(configDir, \".bos\");\n}\n\nexport function getLogsDir(configDir: string): string {\n return join(getBosDir(configDir), \"logs\");\n}\n\nexport function formatLogLine(entry: LogEntry): string {\n const ts = new Date(entry.timestamp).toISOString();\n const prefix = entry.isError ? \"ERR\" : \"OUT\";\n const clean = stripAnsi(entry.line);\n const head = `[${ts}] [${entry.source}] [${prefix}] `;\n const pad = \" \".repeat(head.length);\n const [first, ...rest] = clean.split(\"\\n\");\n return [`${head}${first}`, ...rest.map((line) => `${pad}${line}`)].join(\"\\n\");\n}\n\nexport async function createDevLogger(configDir: string, description: string): Promise<DevLogger> {\n const dir = getLogsDir(configDir);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const now = new Date();\n const ts = now.toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const logFile = join(dir, `dev-${ts}-${process.pid}.log`);\n const latestFile = join(dir, `dev-latest-${process.pid}.log`);\n\n const header =\n `# everything-dev dev session: ${description}\\n` + `# Started: ${now.toISOString()}\\n\\n`;\n // Overwrite each run so dev-latest.log is always actionable.\n await writeFile(logFile, header, \"utf8\");\n await writeFile(latestFile, header, \"utf8\");\n\n let chain = Promise.resolve();\n const enqueue = (fn: () => Promise<void>) => {\n chain = chain.then(fn, fn);\n return chain;\n };\n\n return {\n logFile,\n latestFile,\n write: (entry) =>\n enqueue(async () => {\n const line = `${formatLogLine(entry)}\\n`;\n await appendFile(logFile, line);\n await appendFile(latestFile, line);\n }),\n readLatest: async (opts) => {\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n },\n };\n}\n\nexport function resolveDevLatestFile(configDir: string): string {\n const dir = getLogsDir(configDir);\n const latestFile = join(dir, \"dev-latest.log\");\n if (existsSync(latestFile)) return latestFile;\n const STARTED_RE = /^# Started: (.+)$/m;\n const startedMsOf = (name: string): number => {\n const header = readFileSync(join(dir, name), \"utf8\").slice(0, 256);\n const started = STARTED_RE.exec(header)?.[1];\n const parsed = started ? Date.parse(started) : NaN;\n return Number.isNaN(parsed) ? statSync(join(dir, name)).mtimeMs : parsed;\n };\n const pidOf = (name: string): number => Number(/^dev-latest-(\\d+)\\.log$/.exec(name)?.[1] ?? 0);\n const candidates = readdirSync(dir)\n .filter((name) => /^dev-latest-\\d+\\.log$/.test(name))\n .map((name) => ({ name, startedMs: startedMsOf(name), pid: pidOf(name) }))\n .sort((a, b) => b.startedMs - a.startedMs || b.pid - a.pid || a.name.localeCompare(b.name));\n return candidates.length > 0 ? join(dir, candidates[0]!.name) : latestFile;\n}\n\nexport async function readDevLatestLog(\n configDir: string,\n opts?: { tail?: number },\n): Promise<string> {\n const latestFile = resolveDevLatestFile(configDir);\n const text = await readFile(latestFile, \"utf8\").catch(() => \"\");\n const tail = opts?.tail;\n if (!tail || tail <= 0) return text;\n const lines = text.split(\"\\n\");\n return lines.slice(Math.max(0, lines.length - tail)).join(\"\\n\");\n}\n"],"mappings":"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"}