veryfront 0.1.128 → 0.1.129

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 (382) hide show
  1. package/esm/cli/router.d.ts +0 -5
  2. package/esm/cli/router.d.ts.map +1 -1
  3. package/esm/cli/router.js +30 -2
  4. package/esm/cli/shared/update-check.d.ts +4 -0
  5. package/esm/cli/shared/update-check.d.ts.map +1 -0
  6. package/esm/cli/shared/update-check.js +97 -0
  7. package/esm/deno.d.ts +5 -0
  8. package/esm/deno.js +13 -8
  9. package/esm/src/channels/control-plane.d.ts.map +1 -1
  10. package/esm/src/channels/control-plane.js +5 -5
  11. package/esm/src/channels/invoke.d.ts +1 -1
  12. package/esm/src/channels/invoke.d.ts.map +1 -1
  13. package/esm/src/channels/invoke.js +6 -6
  14. package/esm/src/chat/index.d.ts +12 -24
  15. package/esm/src/chat/index.d.ts.map +1 -1
  16. package/esm/src/chat/index.js +5 -25
  17. package/esm/src/config/env.d.ts.map +1 -1
  18. package/esm/src/config/env.js +18 -10
  19. package/esm/src/data/static-data-fetcher.d.ts +3 -0
  20. package/esm/src/data/static-data-fetcher.d.ts.map +1 -1
  21. package/esm/src/data/static-data-fetcher.js +29 -25
  22. package/esm/src/data/static-paths-fetcher.d.ts.map +1 -1
  23. package/esm/src/data/static-paths-fetcher.js +3 -2
  24. package/esm/src/errors/logging.d.ts.map +1 -1
  25. package/esm/src/errors/logging.js +16 -7
  26. package/esm/src/errors/user-friendly/error-formatter.d.ts.map +1 -1
  27. package/esm/src/errors/user-friendly/error-formatter.js +9 -25
  28. package/esm/src/fs/index.d.ts +11 -12
  29. package/esm/src/fs/index.d.ts.map +1 -1
  30. package/esm/src/fs/index.js +11 -24
  31. package/esm/src/html/dev-scripts.d.ts.map +1 -1
  32. package/esm/src/html/dev-scripts.js +5 -8
  33. package/esm/src/html/html-escape.d.ts +1 -0
  34. package/esm/src/html/html-escape.d.ts.map +1 -1
  35. package/esm/src/html/html-escape.js +3 -0
  36. package/esm/src/html/html-injection.js +2 -2
  37. package/esm/src/html/html-shell-generator.d.ts +5 -2
  38. package/esm/src/html/html-shell-generator.d.ts.map +1 -1
  39. package/esm/src/html/html-shell-generator.js +41 -30
  40. package/esm/src/html/hydration-script-builder/dev-client-renderer.js +2 -2
  41. package/esm/src/html/hydration-script-builder/dev-component-manifest.js +2 -2
  42. package/esm/src/html/hydration-script-builder/dev-error-logger.d.ts.map +1 -1
  43. package/esm/src/html/hydration-script-builder/dev-error-logger.js +2 -6
  44. package/esm/src/html/hydration-script-builder/dev-scripts.js +2 -2
  45. package/esm/src/html/hydration-script-builder/hydration-data-generator.d.ts +3 -1
  46. package/esm/src/html/hydration-script-builder/hydration-data-generator.d.ts.map +1 -1
  47. package/esm/src/html/hydration-script-builder/hydration-data-generator.js +2 -2
  48. package/esm/src/html/hydration-script-builder/index.d.ts +1 -1
  49. package/esm/src/html/hydration-script-builder/index.d.ts.map +1 -1
  50. package/esm/src/html/hydration-script-builder/index.js +1 -1
  51. package/esm/src/html/hydration-script-builder/prod-hydration.js +2 -2
  52. package/esm/src/html/hydration-script-builder/prod-scripts.d.ts +2 -0
  53. package/esm/src/html/hydration-script-builder/prod-scripts.d.ts.map +1 -1
  54. package/esm/src/html/hydration-script-builder/prod-scripts.js +14 -14
  55. package/esm/src/html/schemas/html.schema.d.ts +2 -0
  56. package/esm/src/html/schemas/html.schema.d.ts.map +1 -1
  57. package/esm/src/html/schemas/html.schema.js +2 -0
  58. package/esm/src/html/styles-builder/css-pregeneration.d.ts +17 -1
  59. package/esm/src/html/styles-builder/css-pregeneration.d.ts.map +1 -1
  60. package/esm/src/html/styles-builder/css-pregeneration.js +103 -1
  61. package/esm/src/html/styles-builder/dev-styles.js +2 -2
  62. package/esm/src/html/utils.d.ts +2 -0
  63. package/esm/src/html/utils.d.ts.map +1 -1
  64. package/esm/src/html/utils.js +49 -28
  65. package/esm/src/integrations/remote-tools.d.ts.map +1 -1
  66. package/esm/src/integrations/remote-tools.js +32 -39
  67. package/esm/src/internal-agents/ag-ui-sse.d.ts +0 -1
  68. package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -1
  69. package/esm/src/internal-agents/ag-ui-sse.js +2 -16
  70. package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -1
  71. package/esm/src/internal-agents/control-plane-auth.js +5 -3
  72. package/esm/src/internal-agents/request-body.d.ts.map +1 -1
  73. package/esm/src/internal-agents/request-body.js +6 -3
  74. package/esm/src/internal-agents/session-manager.d.ts +1 -0
  75. package/esm/src/internal-agents/session-manager.d.ts.map +1 -1
  76. package/esm/src/internal-agents/session-manager.js +12 -18
  77. package/esm/src/issues/core.d.ts.map +1 -1
  78. package/esm/src/issues/core.js +24 -23
  79. package/esm/src/issues/schemas/issue.schema.d.ts.map +1 -1
  80. package/esm/src/issues/schemas/issue.schema.js +2 -1
  81. package/esm/src/jobs/runtime-env.d.ts.map +1 -1
  82. package/esm/src/jobs/runtime-env.js +21 -44
  83. package/esm/src/markdown/index.d.ts +1 -2
  84. package/esm/src/markdown/index.d.ts.map +1 -1
  85. package/esm/src/markdown/index.js +1 -6
  86. package/esm/src/mcp/server.d.ts +0 -1
  87. package/esm/src/mcp/server.d.ts.map +1 -1
  88. package/esm/src/mcp/server.js +40 -41
  89. package/esm/src/mdx/index.d.ts +3 -2
  90. package/esm/src/mdx/index.d.ts.map +1 -1
  91. package/esm/src/mdx/index.js +3 -5
  92. package/esm/src/middleware/builtin/logger.d.ts.map +1 -1
  93. package/esm/src/middleware/builtin/logger.js +31 -28
  94. package/esm/src/middleware/builtin/security/rate-limit.d.ts.map +1 -1
  95. package/esm/src/middleware/builtin/security/rate-limit.js +17 -12
  96. package/esm/src/middleware/builtin/timeout.d.ts.map +1 -1
  97. package/esm/src/middleware/builtin/timeout.js +17 -10
  98. package/esm/src/modules/import-map/default-import-map.d.ts.map +1 -1
  99. package/esm/src/modules/import-map/default-import-map.js +4 -3
  100. package/esm/src/oauth/handlers/callback-handler.d.ts +0 -5
  101. package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
  102. package/esm/src/oauth/handlers/callback-handler.js +9 -14
  103. package/esm/src/oauth/handlers/index.d.ts +1 -1
  104. package/esm/src/oauth/handlers/index.js +1 -1
  105. package/esm/src/oauth/handlers/init-handler.d.ts.map +1 -1
  106. package/esm/src/oauth/handlers/init-handler.js +32 -20
  107. package/esm/src/oauth/providers/index.d.ts +1 -1
  108. package/esm/src/oauth/providers/index.js +1 -1
  109. package/esm/src/oauth/schemas/index.d.ts +1 -1
  110. package/esm/src/oauth/schemas/index.js +1 -1
  111. package/esm/src/oauth/token-store/index.d.ts +1 -1
  112. package/esm/src/oauth/token-store/index.js +1 -1
  113. package/esm/src/oauth/token-store/memory.d.ts +1 -1
  114. package/esm/src/oauth/token-store/memory.d.ts.map +1 -1
  115. package/esm/src/oauth/token-store/memory.js +8 -8
  116. package/esm/src/observability/request-profiler.d.ts +31 -0
  117. package/esm/src/observability/request-profiler.d.ts.map +1 -0
  118. package/esm/src/observability/request-profiler.js +94 -0
  119. package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
  120. package/esm/src/observability/tracing/otlp-setup.js +16 -21
  121. package/esm/src/prompt/factory.d.ts.map +1 -1
  122. package/esm/src/prompt/factory.js +10 -12
  123. package/esm/src/prompt/registry.d.ts.map +1 -1
  124. package/esm/src/prompt/registry.js +12 -10
  125. package/esm/src/prompt/schemas/prompt.schema.d.ts.map +1 -1
  126. package/esm/src/prompt/schemas/prompt.schema.js +0 -2
  127. package/esm/src/prompt/types.d.ts +1 -1
  128. package/esm/src/prompt/types.d.ts.map +1 -1
  129. package/esm/src/provider/local/ai-sdk-adapter.d.ts.map +1 -1
  130. package/esm/src/provider/local/ai-sdk-adapter.js +3 -8
  131. package/esm/src/provider/local/env.d.ts +4 -6
  132. package/esm/src/provider/local/env.d.ts.map +1 -1
  133. package/esm/src/provider/local/env.js +14 -1
  134. package/esm/src/provider/local/local-engine.d.ts.map +1 -1
  135. package/esm/src/provider/local/local-engine.js +2 -7
  136. package/esm/src/provider/model-registry.d.ts.map +1 -1
  137. package/esm/src/provider/model-registry.js +2 -7
  138. package/esm/src/provider/veryfront-cloud/provider.d.ts.map +1 -1
  139. package/esm/src/provider/veryfront-cloud/provider.js +1 -7
  140. package/esm/src/provider/veryfront-cloud/shared.d.ts.map +1 -1
  141. package/esm/src/provider/veryfront-cloud/shared.js +9 -11
  142. package/esm/src/proxy/handler.d.ts.map +1 -1
  143. package/esm/src/proxy/handler.js +56 -57
  144. package/esm/src/react/compat/hooks-adapter.d.ts +1 -7
  145. package/esm/src/react/compat/hooks-adapter.d.ts.map +1 -1
  146. package/esm/src/react/compat/hooks-adapter.js +35 -40
  147. package/esm/src/react/components/Head.d.ts +1 -26
  148. package/esm/src/react/components/Head.d.ts.map +1 -1
  149. package/esm/src/react/components/Head.js +1 -172
  150. package/esm/src/react/context/index.d.ts +2 -46
  151. package/esm/src/react/context/index.d.ts.map +1 -1
  152. package/esm/src/react/context/index.js +1 -44
  153. package/esm/src/react/head-collector.d.ts +1 -10
  154. package/esm/src/react/head-collector.d.ts.map +1 -1
  155. package/esm/src/react/head-collector.js +4 -0
  156. package/esm/src/react/router/index.d.ts +2 -45
  157. package/esm/src/react/router/index.d.ts.map +1 -1
  158. package/esm/src/react/router/index.js +1 -49
  159. package/esm/src/react/runtime/core.d.ts +49 -0
  160. package/esm/src/react/runtime/core.d.ts.map +1 -0
  161. package/esm/src/react/runtime/core.js +200 -0
  162. package/esm/src/rendering/orchestrator/html.d.ts +2 -0
  163. package/esm/src/rendering/orchestrator/html.d.ts.map +1 -1
  164. package/esm/src/rendering/orchestrator/html.js +69 -12
  165. package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts.map +1 -1
  166. package/esm/src/rendering/orchestrator/ssr-orchestrator.js +4 -0
  167. package/esm/src/rendering/orchestrator/types.d.ts +4 -0
  168. package/esm/src/rendering/orchestrator/types.d.ts.map +1 -1
  169. package/esm/src/repositories/types.d.ts.map +1 -1
  170. package/esm/src/resource/factory.d.ts.map +1 -1
  171. package/esm/src/resource/factory.js +12 -9
  172. package/esm/src/resource/registry.d.ts +3 -3
  173. package/esm/src/resource/registry.d.ts.map +1 -1
  174. package/esm/src/resource/registry.js +7 -7
  175. package/esm/src/schemas/common.d.ts.map +1 -1
  176. package/esm/src/schemas/common.js +7 -4
  177. package/esm/src/security/http/config.d.ts +0 -1
  178. package/esm/src/security/http/config.d.ts.map +1 -1
  179. package/esm/src/security/http/config.js +3 -16
  180. package/esm/src/security/http/response/security-handler.d.ts +1 -0
  181. package/esm/src/security/http/response/security-handler.d.ts.map +1 -1
  182. package/esm/src/security/http/response/security-handler.js +17 -12
  183. package/esm/src/security/index.d.ts +4 -2
  184. package/esm/src/security/index.d.ts.map +1 -1
  185. package/esm/src/security/index.js +3 -1
  186. package/esm/src/server/handlers/dev/styles-css.handler.d.ts.map +1 -1
  187. package/esm/src/server/handlers/dev/styles-css.handler.js +8 -7
  188. package/esm/src/server/handlers/monitoring/metrics.handler.d.ts.map +1 -1
  189. package/esm/src/server/handlers/monitoring/metrics.handler.js +3 -1
  190. package/esm/src/server/handlers/request/module/module-server-handler.d.ts.map +1 -1
  191. package/esm/src/server/handlers/request/module/module-server-handler.js +18 -15
  192. package/esm/src/server/handlers/request/prod-hydration-module.handler.d.ts +8 -0
  193. package/esm/src/server/handlers/request/prod-hydration-module.handler.d.ts.map +1 -0
  194. package/esm/src/server/handlers/request/prod-hydration-module.handler.js +41 -0
  195. package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts.map +1 -1
  196. package/esm/src/server/handlers/request/ssr/ssr.handler.js +3 -0
  197. package/esm/src/server/production-server.d.ts.map +1 -1
  198. package/esm/src/server/production-server.js +65 -0
  199. package/esm/src/server/runtime-handler/handler-context-builder.d.ts +1 -1
  200. package/esm/src/server/runtime-handler/handler-context-builder.d.ts.map +1 -1
  201. package/esm/src/server/runtime-handler/index.d.ts +1 -1
  202. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  203. package/esm/src/server/runtime-handler/index.js +36 -11
  204. package/esm/src/server/runtime-handler/request-utils.d.ts +7 -0
  205. package/esm/src/server/runtime-handler/request-utils.d.ts.map +1 -1
  206. package/esm/src/server/runtime-handler/request-utils.js +10 -0
  207. package/esm/src/server/services/rendering/ssr.service.d.ts +1 -0
  208. package/esm/src/server/services/rendering/ssr.service.d.ts.map +1 -1
  209. package/esm/src/server/services/rendering/ssr.service.js +12 -5
  210. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
  211. package/esm/src/skill/allowed-tools.d.ts +3 -8
  212. package/esm/src/skill/allowed-tools.d.ts.map +1 -1
  213. package/esm/src/skill/executor.js +2 -2
  214. package/esm/src/skill/parser.d.ts.map +1 -1
  215. package/esm/src/skill/parser.js +12 -12
  216. package/esm/src/skill/path-safety.js +1 -1
  217. package/esm/src/skill/tools.d.ts.map +1 -1
  218. package/esm/src/skill/tools.js +18 -11
  219. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
  220. package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
  221. package/esm/src/task/discovery.d.ts.map +1 -1
  222. package/esm/src/task/discovery.js +73 -95
  223. package/esm/src/tool/executor.d.ts.map +1 -1
  224. package/esm/src/tool/executor.js +8 -7
  225. package/esm/src/tool/factory.d.ts.map +1 -1
  226. package/esm/src/tool/factory.js +13 -16
  227. package/esm/src/transforms/esm/package-registry.d.ts +4 -0
  228. package/esm/src/transforms/esm/package-registry.d.ts.map +1 -1
  229. package/esm/src/transforms/esm/package-registry.js +34 -17
  230. package/esm/src/transforms/import-rewriter/strategies/veryfront-strategy.d.ts.map +1 -1
  231. package/esm/src/transforms/import-rewriter/strategies/veryfront-strategy.js +2 -1
  232. package/esm/src/transforms/mdx/esm-module-loader/cache-format.d.ts.map +1 -1
  233. package/esm/src/transforms/mdx/esm-module-loader/cache-format.js +26 -1
  234. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts +1 -1
  235. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
  236. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +1 -1
  237. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.d.ts +1 -0
  238. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.d.ts.map +1 -1
  239. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.js +3 -0
  240. package/esm/src/transforms/pipeline/stages/ssr-vf-modules/index.d.ts +1 -1
  241. package/esm/src/transforms/pipeline/stages/ssr-vf-modules/index.js +1 -1
  242. package/esm/src/transforms/veryfront-module-urls.d.ts.map +1 -1
  243. package/esm/src/transforms/veryfront-module-urls.js +7 -3
  244. package/esm/src/types/entities/getEntityInfo.d.ts.map +1 -1
  245. package/esm/src/types/entities/getEntityInfo.js +79 -127
  246. package/esm/src/utils/path-utils.d.ts +1 -1
  247. package/esm/src/utils/path-utils.d.ts.map +1 -1
  248. package/esm/src/utils/path-utils.js +16 -7
  249. package/esm/src/utils/version-constant.d.ts +1 -1
  250. package/esm/src/utils/version-constant.js +1 -1
  251. package/esm/src/utils/version.d.ts.map +1 -1
  252. package/esm/src/utils/version.js +0 -1
  253. package/esm/src/workflow/worker/dynamic-job-entrypoint.d.ts.map +1 -1
  254. package/esm/src/workflow/worker/dynamic-job-entrypoint.js +5 -72
  255. package/esm/src/workflow/worker/job-entrypoint.d.ts.map +1 -1
  256. package/esm/src/workflow/worker/job-entrypoint.js +5 -72
  257. package/esm/src/workflow/worker/shared.d.ts +18 -0
  258. package/esm/src/workflow/worker/shared.d.ts.map +1 -0
  259. package/esm/src/workflow/worker/shared.js +77 -0
  260. package/package.json +1 -1
  261. package/src/cli/router.ts +41 -2
  262. package/src/cli/shared/update-check.ts +110 -0
  263. package/src/deno.js +13 -8
  264. package/src/src/channels/control-plane.ts +6 -10
  265. package/src/src/channels/invoke.ts +7 -7
  266. package/src/src/chat/index.ts +96 -132
  267. package/src/src/config/env.ts +24 -11
  268. package/src/src/data/static-data-fetcher.ts +59 -34
  269. package/src/src/data/static-paths-fetcher.ts +4 -2
  270. package/src/src/errors/logging.ts +21 -7
  271. package/src/src/errors/user-friendly/error-formatter.ts +14 -29
  272. package/src/src/fs/index.ts +21 -30
  273. package/src/src/html/dev-scripts.ts +5 -9
  274. package/src/src/html/html-escape.ts +4 -0
  275. package/src/src/html/html-injection.ts +2 -2
  276. package/src/src/html/html-shell-generator.ts +60 -26
  277. package/src/src/html/hydration-script-builder/dev-client-renderer.ts +2 -2
  278. package/src/src/html/hydration-script-builder/dev-component-manifest.ts +2 -2
  279. package/src/src/html/hydration-script-builder/dev-error-logger.ts +2 -8
  280. package/src/src/html/hydration-script-builder/dev-scripts.ts +2 -2
  281. package/src/src/html/hydration-script-builder/hydration-data-generator.ts +2 -1
  282. package/src/src/html/hydration-script-builder/index.ts +5 -1
  283. package/src/src/html/hydration-script-builder/prod-hydration.ts +2 -2
  284. package/src/src/html/hydration-script-builder/prod-scripts.ts +16 -15
  285. package/src/src/html/schemas/html.schema.ts +2 -0
  286. package/src/src/html/styles-builder/css-pregeneration.ts +133 -1
  287. package/src/src/html/styles-builder/dev-styles.ts +2 -2
  288. package/src/src/html/utils.ts +62 -29
  289. package/src/src/integrations/remote-tools.ts +39 -37
  290. package/src/src/internal-agents/ag-ui-sse.ts +2 -17
  291. package/src/src/internal-agents/control-plane-auth.ts +8 -6
  292. package/src/src/internal-agents/request-body.ts +7 -5
  293. package/src/src/internal-agents/session-manager.ts +16 -20
  294. package/src/src/issues/core.ts +24 -27
  295. package/src/src/issues/schemas/issue.schema.ts +3 -1
  296. package/src/src/jobs/runtime-env.ts +24 -50
  297. package/src/src/markdown/index.ts +5 -8
  298. package/src/src/mcp/server.ts +50 -53
  299. package/src/src/mdx/index.ts +7 -8
  300. package/src/src/middleware/builtin/logger.ts +44 -29
  301. package/src/src/middleware/builtin/security/rate-limit.ts +20 -11
  302. package/src/src/middleware/builtin/timeout.ts +22 -13
  303. package/src/src/modules/import-map/default-import-map.ts +4 -3
  304. package/src/src/oauth/handlers/callback-handler.ts +9 -16
  305. package/src/src/oauth/handlers/index.ts +1 -1
  306. package/src/src/oauth/handlers/init-handler.ts +56 -27
  307. package/src/src/oauth/providers/index.ts +1 -1
  308. package/src/src/oauth/schemas/index.ts +1 -1
  309. package/src/src/oauth/token-store/index.ts +1 -1
  310. package/src/src/oauth/token-store/memory.ts +8 -8
  311. package/src/src/observability/request-profiler.ts +140 -0
  312. package/src/src/observability/tracing/otlp-setup.ts +16 -22
  313. package/src/src/prompt/factory.ts +16 -14
  314. package/src/src/prompt/registry.ts +14 -13
  315. package/src/src/prompt/schemas/prompt.schema.ts +0 -4
  316. package/src/src/prompt/types.ts +1 -2
  317. package/src/src/provider/local/ai-sdk-adapter.ts +3 -10
  318. package/src/src/provider/local/env.ts +22 -2
  319. package/src/src/provider/local/local-engine.ts +2 -9
  320. package/src/src/provider/model-registry.ts +2 -9
  321. package/src/src/provider/veryfront-cloud/provider.ts +1 -8
  322. package/src/src/provider/veryfront-cloud/shared.ts +12 -15
  323. package/src/src/proxy/handler.ts +90 -74
  324. package/src/src/react/compat/hooks-adapter.ts +43 -44
  325. package/src/src/react/components/Head.tsx +1 -181
  326. package/src/src/react/context/index.tsx +2 -83
  327. package/src/src/react/head-collector.ts +9 -0
  328. package/src/src/react/router/index.tsx +2 -100
  329. package/src/src/react/runtime/core.ts +303 -0
  330. package/src/src/rendering/orchestrator/html.ts +122 -18
  331. package/src/src/rendering/orchestrator/ssr-orchestrator.ts +8 -0
  332. package/src/src/rendering/orchestrator/types.ts +4 -0
  333. package/src/src/repositories/types.ts +0 -4
  334. package/src/src/resource/factory.ts +15 -11
  335. package/src/src/resource/registry.ts +7 -7
  336. package/src/src/schemas/common.ts +8 -5
  337. package/src/src/security/http/config.ts +3 -19
  338. package/src/src/security/http/response/security-handler.ts +22 -13
  339. package/src/src/security/index.ts +4 -7
  340. package/src/src/server/handlers/dev/styles-css.handler.ts +32 -14
  341. package/src/src/server/handlers/monitoring/metrics.handler.ts +3 -1
  342. package/src/src/server/handlers/request/module/module-server-handler.ts +24 -17
  343. package/src/src/server/handlers/request/prod-hydration-module.handler.ts +61 -0
  344. package/src/src/server/handlers/request/ssr/ssr.handler.ts +3 -0
  345. package/src/src/server/production-server.ts +84 -0
  346. package/src/src/server/runtime-handler/handler-context-builder.ts +1 -1
  347. package/src/src/server/runtime-handler/index.ts +44 -13
  348. package/src/src/server/runtime-handler/request-utils.ts +11 -0
  349. package/src/src/server/services/rendering/ssr.service.ts +31 -18
  350. package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +1 -1
  351. package/src/src/skill/allowed-tools.ts +1 -8
  352. package/src/src/skill/executor.ts +2 -2
  353. package/src/src/skill/parser.ts +13 -20
  354. package/src/src/skill/path-safety.ts +1 -1
  355. package/src/src/skill/tools.ts +27 -20
  356. package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
  357. package/src/src/task/discovery.ts +97 -97
  358. package/src/src/tool/executor.ts +10 -8
  359. package/src/src/tool/factory.ts +21 -22
  360. package/src/src/tool/types.ts +0 -17
  361. package/src/src/transforms/esm/package-registry.ts +52 -20
  362. package/src/src/transforms/import-rewriter/strategies/veryfront-strategy.ts +2 -1
  363. package/src/src/transforms/mdx/esm-module-loader/cache-format.ts +34 -1
  364. package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +1 -1
  365. package/src/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.ts +4 -0
  366. package/src/src/transforms/pipeline/stages/ssr-vf-modules/index.ts +1 -1
  367. package/src/src/transforms/veryfront-module-urls.ts +6 -2
  368. package/src/src/types/entities/getEntityInfo.ts +131 -152
  369. package/src/src/utils/path-utils.ts +16 -7
  370. package/src/src/utils/version-constant.ts +1 -1
  371. package/src/src/utils/version.ts +0 -1
  372. package/src/src/workflow/worker/dynamic-job-entrypoint.ts +18 -84
  373. package/src/src/workflow/worker/job-entrypoint.ts +18 -85
  374. package/src/src/workflow/worker/shared.ts +127 -0
  375. package/esm/src/prompt/schemas/index.d.ts +0 -7
  376. package/esm/src/prompt/schemas/index.d.ts.map +0 -1
  377. package/esm/src/prompt/schemas/index.js +0 -6
  378. package/esm/src/security/http/handlers-index.d.ts +0 -5
  379. package/esm/src/security/http/handlers-index.d.ts.map +0 -1
  380. package/esm/src/security/http/handlers-index.js +0 -3
  381. package/src/src/prompt/schemas/index.ts +0 -7
  382. package/src/src/security/http/handlers-index.ts +0 -4
@@ -0,0 +1,200 @@
1
+ import * as dntShim from "../../../_dnt.shims.js";
2
+ import React, { useEffect } from "react";
3
+ const defaultRouter = {
4
+ domain: "",
5
+ path: "/",
6
+ pathname: "/",
7
+ params: {},
8
+ query: {},
9
+ isPreview: false,
10
+ isMounted: false,
11
+ navigate: async () => { },
12
+ push: async () => { },
13
+ replace: async () => { },
14
+ reload: async () => { },
15
+ };
16
+ const defaultPageContext = {
17
+ slug: "/",
18
+ path: "/",
19
+ params: {},
20
+ query: {},
21
+ frontmatter: {},
22
+ headings: [],
23
+ mdxHeadings: [],
24
+ };
25
+ const ROUTER_CONTEXT_SYMBOL = Symbol.for("veryfront.react.router-context");
26
+ const PAGE_CONTEXT_SYMBOL = Symbol.for("veryfront.react.page-context");
27
+ const HEAD_COLLECTOR_SYMBOL = Symbol.for("veryfront.react.collect-head");
28
+ const globalRouterContext = dntShim.dntGlobalThis;
29
+ const globalPageContext = dntShim.dntGlobalThis;
30
+ const RouterContext = globalRouterContext[ROUTER_CONTEXT_SYMBOL] ??
31
+ (globalRouterContext[ROUTER_CONTEXT_SYMBOL] = React.createContext(defaultRouter));
32
+ const PageContextContext = globalPageContext[PAGE_CONTEXT_SYMBOL] ??
33
+ (globalPageContext[PAGE_CONTEXT_SYMBOL] = React.createContext(defaultPageContext));
34
+ function isServerEnvironment() {
35
+ const ssrFlag = dntShim.dntGlobalThis.__VERYFRONT_SSR__;
36
+ if (ssrFlag === true)
37
+ return true;
38
+ return typeof dntShim.dntGlobalThis === "undefined";
39
+ }
40
+ function getDocumentNonce() {
41
+ if (typeof document === "undefined")
42
+ return undefined;
43
+ const element = document.querySelector("script[nonce], style[nonce], link[nonce]");
44
+ if (!element)
45
+ return undefined;
46
+ const nonce = element.nonce || element.getAttribute("nonce") || "";
47
+ return nonce || undefined;
48
+ }
49
+ function collectHead(data) {
50
+ const collector = dntShim.dntGlobalThis[HEAD_COLLECTOR_SYMBOL];
51
+ collector?.(data);
52
+ }
53
+ export function RouterProvider({ children, router, }) {
54
+ return React.createElement(RouterContext.Provider, { value: router ?? defaultRouter }, children);
55
+ }
56
+ export function useRouter() {
57
+ return React.useContext(RouterContext);
58
+ }
59
+ export function Link({ prefetch = true, children, ...rest }) {
60
+ return React.createElement("a", { ...rest, "data-prefetch": prefetch ? "true" : undefined }, children);
61
+ }
62
+ export function PageContextProvider({ children, pageContext, }) {
63
+ return React.createElement(PageContextContext.Provider, { value: pageContext ?? defaultPageContext }, children);
64
+ }
65
+ export function usePageContext() {
66
+ return React.useContext(PageContextContext);
67
+ }
68
+ export function Head({ children }) {
69
+ const isSSR = isServerEnvironment();
70
+ if (isSSR && children) {
71
+ React.Children.forEach(children, (child) => {
72
+ if (!React.isValidElement(child))
73
+ return;
74
+ const { type } = child;
75
+ const props = child.props;
76
+ if (typeof type !== "string" || type === "body")
77
+ return;
78
+ if (type === "title") {
79
+ collectHead({ title: String(props.children ?? "") });
80
+ return;
81
+ }
82
+ if (type === "meta") {
83
+ collectHead({
84
+ metas: [{
85
+ name: props.name,
86
+ property: props.property,
87
+ content: String(props.content ?? ""),
88
+ }],
89
+ });
90
+ return;
91
+ }
92
+ if (type === "link") {
93
+ const link = {};
94
+ for (const [key, value] of Object.entries(props)) {
95
+ if (value != null)
96
+ link[key] = String(value);
97
+ }
98
+ collectHead({ links: [link] });
99
+ return;
100
+ }
101
+ if (type === "style") {
102
+ collectHead({ styles: [String(props.children ?? "")] });
103
+ return;
104
+ }
105
+ if (type === "script") {
106
+ const script = {};
107
+ for (const [key, value] of Object.entries(props)) {
108
+ if (key === "children" || key === "dangerouslySetInnerHTML")
109
+ continue;
110
+ if (value != null)
111
+ script[key] = String(value);
112
+ }
113
+ if (props.dangerouslySetInnerHTML) {
114
+ const html = props.dangerouslySetInnerHTML;
115
+ if (html.__html)
116
+ script.content = html.__html;
117
+ }
118
+ else if (typeof props.children === "string") {
119
+ script.content = props.children;
120
+ }
121
+ collectHead({ scripts: [script] });
122
+ }
123
+ });
124
+ }
125
+ useEffect(() => {
126
+ if (!children)
127
+ return;
128
+ const addedElements = [];
129
+ const nonce = getDocumentNonce();
130
+ React.Children.forEach(children, (child) => {
131
+ if (!React.isValidElement(child))
132
+ return;
133
+ const { type } = child;
134
+ const props = child.props;
135
+ if (typeof type !== "string" || type === "body")
136
+ return;
137
+ if (type === "title") {
138
+ document.title = String(props.children ?? "");
139
+ return;
140
+ }
141
+ const element = document.createElement(type);
142
+ if ((type === "style" || type === "script") && !props.nonce && nonce) {
143
+ element.setAttribute("nonce", nonce);
144
+ }
145
+ if (type === "script") {
146
+ const src = props.src;
147
+ const id = props.id;
148
+ if (id && document.querySelector(`script[data-vf-head][id="${id}"]`))
149
+ return;
150
+ if (src && document.querySelector(`script[data-vf-head][src="${src}"]`))
151
+ return;
152
+ const content = typeof props.children === "string"
153
+ ? props.children
154
+ : props.dangerouslySetInnerHTML?.__html;
155
+ if (content && !id) {
156
+ let sum = 0;
157
+ for (let i = 0; i < Math.min(content.length, 200); i++) {
158
+ sum = ((sum << 5) - sum + content.charCodeAt(i)) | 0;
159
+ }
160
+ const hash = `vf${Math.abs(sum).toString(36)}`;
161
+ if (document.querySelector(`script[data-vf-head][data-vf-hash="${hash}"]`))
162
+ return;
163
+ element.setAttribute("data-vf-hash", hash);
164
+ }
165
+ element.setAttribute("data-vf-head", "true");
166
+ }
167
+ for (const [key, value] of Object.entries(props)) {
168
+ if (key === "children")
169
+ continue;
170
+ let attrName = key;
171
+ if (key === "className")
172
+ attrName = "class";
173
+ else if (key === "htmlFor")
174
+ attrName = "for";
175
+ if (typeof value === "boolean") {
176
+ if (value)
177
+ element.setAttribute(attrName, "");
178
+ continue;
179
+ }
180
+ if (value != null)
181
+ element.setAttribute(attrName, String(value));
182
+ }
183
+ if (typeof props.children === "string") {
184
+ element.textContent = props.children;
185
+ }
186
+ element.setAttribute("data-veryfront-managed", "1");
187
+ document.head.appendChild(element);
188
+ addedElements.push(element);
189
+ });
190
+ return () => {
191
+ for (const el of addedElements)
192
+ el.remove();
193
+ };
194
+ }, [children]);
195
+ return React.createElement("div", {
196
+ "data-veryfront-head": "1",
197
+ style: { display: "none" },
198
+ });
199
+ }
200
+ export { RouterProvider as Router };
@@ -32,6 +32,8 @@ export declare class HTMLGenerator {
32
32
  private detectUseClientDirective;
33
33
  private wrapHTMLFragment;
34
34
  private generateShellParts;
35
+ private startProjectCSSPreparation;
36
+ private startPreparedCSSWarmup;
35
37
  private buildHeadElements;
36
38
  private mergeFrontmatter;
37
39
  private resolveAppPath;
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAuHhD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAsCZ,sBAAsB;YAiCtB,wBAAwB;YAmBxB,gBAAgB;YAehB,kBAAkB;IAsDhC,OAAO,CAAC,iBAAiB;IA4DzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;YAQR,eAAe;YAaf,gBAAgB;IAwE9B;;;;OAIG;YACW,gBAAgB;IA2D9B,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,qBAAqB;YAOf,6BAA6B;CAyD5C"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2HhD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAgDZ,sBAAsB;YAiCtB,wBAAwB;YAmBxB,gBAAgB;YAyBhB,kBAAkB;IAwDhC,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,iBAAiB;IA4DzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;YAQR,eAAe;YAaf,gBAAgB;IAgF9B;;;;OAIG;YACW,gBAAgB;IA2D9B,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,qBAAqB;YAOf,6BAA6B;CAyD5C"}
@@ -8,7 +8,10 @@ import { computeSourceHash } from "../../studio/hash-utils.js";
8
8
  import { extractRelativePath } from "../../utils/route-path-utils.js";
9
9
  import { resolveAppComponentPath } from "../layouts/utils/app-resolver.js";
10
10
  import { StreamTimeoutError, streamToString } from "../utils/stream-utils.js";
11
+ import { profilePhase, profileSyncPhase } from "../../observability/request-profiler.js";
11
12
  import { normalizeCssModuleKey, rewriteCssModuleContent, } from "../../transforms/css-modules/naming.js";
13
+ import { getProjectCSS } from "../../html/styles-builder/index.js";
14
+ import { warmPreparedCSSArtifactFromFiles } from "../../html/styles-builder/css-pregeneration.js";
12
15
  import { getRouteCandidates } from "./css-candidate-manifest.js";
13
16
  import { resolveStyleContentVersion } from "../../html/styles-builder/content-version.js";
14
17
  import { createStyleScopeProfile } from "../../html/styles-builder/style-scope-profile.js";
@@ -117,7 +120,9 @@ export class HTMLGenerator {
117
120
  async generateHTMLStream(reactStream, context) {
118
121
  const fullContext = context;
119
122
  const mergedFrontmatter = this.mergeFrontmatter(fullContext);
120
- const htmlOptions = await this.buildHTMLOptions(fullContext, mergedFrontmatter);
123
+ const htmlOptions = await profilePhase("html.build_options", () => this.buildHTMLOptions(fullContext, mergedFrontmatter));
124
+ const projectCSSPromise = this.startProjectCSSPreparation(fullContext, htmlOptions);
125
+ this.startPreparedCSSWarmup(fullContext, htmlOptions);
121
126
  let reactContent;
122
127
  try {
123
128
  reactContent = (await streamToString(reactStream)).trim();
@@ -130,7 +135,7 @@ export class HTMLGenerator {
130
135
  });
131
136
  reactContent = error.partialContent.trim();
132
137
  }
133
- const { start, end } = await this.generateShellParts(fullContext, mergedFrontmatter, htmlOptions, reactContent);
138
+ const { start, end } = await profilePhase("html.generate_shell_parts", () => this.generateShellParts(fullContext, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise));
134
139
  const encoder = new TextEncoder();
135
140
  const fullHtml = addNonceToRenderedTags(`${start}${reactContent}${end}`, context.options?.nonce);
136
141
  return new ReadableStream({
@@ -183,12 +188,14 @@ export class HTMLGenerator {
183
188
  }
184
189
  async wrapHTMLFragment(context) {
185
190
  const mergedFrontmatter = this.mergeFrontmatter(context);
186
- const htmlOptions = await this.buildHTMLOptions(context, mergedFrontmatter);
191
+ const htmlOptions = await profilePhase("html.build_options", () => this.buildHTMLOptions(context, mergedFrontmatter));
192
+ const projectCSSPromise = this.startProjectCSSPreparation(context, htmlOptions);
193
+ this.startPreparedCSSWarmup(context, htmlOptions);
187
194
  const reactContent = context.html.trim();
188
- const { start, end } = await this.generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent);
195
+ const { start, end } = await profilePhase("html.generate_shell_parts", () => this.generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise));
189
196
  return `${start}${reactContent}${end}`;
190
197
  }
191
- async generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent) {
198
+ async generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise) {
192
199
  const head = context.collectedHead;
193
200
  const effectiveTitle = head?.title || mergedFrontmatter.title || "Veryfront App";
194
201
  const effectiveDescription = head?.description || mergedFrontmatter.description || "";
@@ -204,7 +211,7 @@ export class HTMLGenerator {
204
211
  frontmatter: enrichedFrontmatter,
205
212
  layoutFrontmatter: context.layoutBundle?.frontmatter,
206
213
  ssrHash: context.ssrHash,
207
- }, htmlOptions, context.options?.params, context.options?.props, reactContent);
214
+ }, htmlOptions, context.options?.params, context.options?.props, reactContent, projectCSSPromise);
208
215
  const { scripts, other } = this.buildHeadElements(head);
209
216
  if (!scripts && !other)
210
217
  return { start, end };
@@ -225,6 +232,54 @@ export class HTMLGenerator {
225
232
  }
226
233
  return { start: modifiedStart, end };
227
234
  }
235
+ startProjectCSSPreparation(context, htmlOptions) {
236
+ const isLocalProject = htmlOptions.isLocalProject ?? false;
237
+ if (isLocalProject || htmlOptions.environment !== "production")
238
+ return undefined;
239
+ const projectScope = htmlOptions.projectSlug || htmlOptions.projectId || context.slug;
240
+ if (!projectScope || projectScope === "default")
241
+ return undefined;
242
+ return getProjectCSS(projectScope, htmlOptions.globalCSS, new Set([...(htmlOptions.projectClasses ?? [])]), {
243
+ minify: true,
244
+ environment: htmlOptions.environment,
245
+ buildMode: htmlOptions.mode,
246
+ });
247
+ }
248
+ startPreparedCSSWarmup(context, htmlOptions) {
249
+ const isLocalProject = htmlOptions.isLocalProject ?? false;
250
+ const usesPreviewStylesheet = isLocalProject || htmlOptions.environment !== "production";
251
+ if (!usesPreviewStylesheet)
252
+ return;
253
+ const wrappedFs = this.config.adapter.fs;
254
+ if (typeof wrappedFs.getUnderlyingAdapter !== "function")
255
+ return;
256
+ const fsAdapter = wrappedFs.getUnderlyingAdapter();
257
+ if (typeof fsAdapter.getAllSourceFiles !== "function")
258
+ return;
259
+ const projectScope = htmlOptions.projectSlug || htmlOptions.projectId || context.slug;
260
+ if (!projectScope || projectScope === "default")
261
+ return;
262
+ const projectVersion = this.getProjectContentVersion() ??
263
+ (this.config.mode === "development" ? "dev" : "unknown");
264
+ const styleProfile = createStyleScopeProfile(this.config.config);
265
+ const stylesheetPath = this.config.config?.tailwind?.stylesheet;
266
+ Promise.resolve(fsAdapter.getAllSourceFiles()).then((files) => warmPreparedCSSArtifactFromFiles({
267
+ projectSlug: projectScope,
268
+ projectVersion,
269
+ projectDir: this.config.projectDir,
270
+ files,
271
+ styleProfile,
272
+ stylesheetPath,
273
+ minify: true,
274
+ environment: "preview",
275
+ buildMode: "production",
276
+ })).catch((error) => {
277
+ logger.debug("Prepared CSS warmup skipped after source scan failure", {
278
+ projectScope,
279
+ error: error instanceof Error ? error.message : String(error),
280
+ });
281
+ });
282
+ }
228
283
  buildHeadElements(head) {
229
284
  if (!head)
230
285
  return { scripts: "", other: "" };
@@ -309,14 +364,14 @@ export class HTMLGenerator {
309
364
  async buildHTMLOptions(context, mergedFrontmatter) {
310
365
  const stylesheetPath = this.config.config?.tailwind?.stylesheet || "globals.css";
311
366
  const [appComponentPathOrNull, globalCSS] = await Promise.all([
312
- this.resolveAppPath(),
313
- this.loadProjectFile(stylesheetPath),
367
+ profilePhase("html.resolve_app_path", () => this.resolveAppPath()),
368
+ profilePhase("html.load_global_css", () => this.loadProjectFile(stylesheetPath)),
314
369
  ]);
315
370
  const appComponentPath = appComponentPathOrNull ?? undefined;
316
- const projectClasses = await this.extractProjectClassesForRoute(context, appComponentPath);
371
+ const projectClasses = await profilePhase("html.route_candidates", () => this.extractProjectClassesForRoute(context, appComponentPath));
317
372
  // Load CSS imported by components and merge with globalCSS.
318
373
  // Deduplicate against the configured stylesheet to avoid double-loading.
319
- const combinedCSS = await this.mergeImportedCSS(globalCSS, context.cssImports, stylesheetPath);
374
+ const combinedCSS = await profilePhase("html.merge_imported_css", () => this.mergeImportedCSS(globalCSS, context.cssImports, stylesheetPath));
320
375
  logger.debug("App component resolution", {
321
376
  appComponentPath,
322
377
  projectDir: this.config.projectDir,
@@ -329,7 +384,7 @@ export class HTMLGenerator {
329
384
  const sourceHash = context.options?.studioEmbed && context.pageInfo.entity.content
330
385
  ? computeSourceHash(context.pageInfo.entity.content)
331
386
  : undefined;
332
- return {
387
+ return profileSyncPhase("html.build_options.finalize", () => ({
333
388
  mode: this.config.mode,
334
389
  config: this.config.config,
335
390
  projectDir: this.config.projectDir,
@@ -346,6 +401,7 @@ export class HTMLGenerator {
346
401
  frontmatter: mergedFrontmatter,
347
402
  studioEmbed: context.options?.studioEmbed,
348
403
  projectId: context.options?.projectId,
404
+ projectSlug: context.options?.projectSlug,
349
405
  pageId: context.options?.pageId,
350
406
  sourceHash,
351
407
  colorScheme: context.options?.colorScheme,
@@ -356,7 +412,8 @@ export class HTMLGenerator {
356
412
  projectClasses,
357
413
  isLocalProject: this.config.mode === "development",
358
414
  noHmr: context.options?.noHmr,
359
- };
415
+ forceProductionScripts: context.options?.forceProductionScripts,
416
+ }));
360
417
  }
361
418
  /**
362
419
  * Load CSS files imported by components and merge with the global stylesheet.
@@ -1 +1 @@
1
- {"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,mBAAmB,CACvB,WAAW,EAAE,KAAK,CAAC,YAAY,EAC/B,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC,EAClE,OAAO,CAAC,EAAE,aAAa,EACvB,gBAAgB,CAAC,EAAE,mBAAmB,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAiG9B;;;;;;OAMG;YACW,kBAAkB;IAiFhC,OAAO,CAAC,YAAY;CAerB"}
1
+ {"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,mBAAmB,CACvB,WAAW,EAAE,KAAK,CAAC,YAAY,EAC/B,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC,EAClE,OAAO,CAAC,EAAE,aAAa,EACvB,gBAAgB,CAAC,EAAE,mBAAmB,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAqG9B;;;;;;OAMG;YACW,kBAAkB;IAiFhC,OAAO,CAAC,YAAY;CAerB"}
@@ -6,6 +6,7 @@ import { SpanNames } from "../../observability/tracing/span-names.js";
6
6
  import { computeHash } from "../utils/index.js";
7
7
  import { runWithHeadCollector } from "../../react/head-collector.js";
8
8
  import { getWorkerPool, isSSRIsolationEnabled } from "../../security/sandbox/worker-pool.js";
9
+ import { endRenderSession, hasRenderSession, } from "../../transforms/mdx/esm-module-loader/module-fetcher/index.js";
9
10
  const logger = rendererLogger.component("ssr-orchestrator");
10
11
  function getElementTypeName(el) {
11
12
  if (!el?.type)
@@ -47,6 +48,9 @@ export class SSROrchestrator {
47
48
  "ssr.mode": this.config.mode,
48
49
  }));
49
50
  const { html, stream } = renderResult;
51
+ if (options?.renderSessionId && hasRenderSession(options.renderSessionId)) {
52
+ endRenderSession(options.renderSessionId);
53
+ }
50
54
  const mergedOptions = {
51
55
  ...generationContext.options,
52
56
  ...options,
@@ -52,6 +52,10 @@ export interface RenderOptions {
52
52
  skipCachePersist?: boolean;
53
53
  /** Disable HMR scripts (for embedded iframes where WebSocket is unwanted) */
54
54
  noHmr?: boolean;
55
+ /** Force production client scripts even when rendering a local project */
56
+ forceProductionScripts?: boolean;
57
+ /** Internal SSR module-tracking session id for first-response manifest preloads */
58
+ renderSessionId?: string;
55
59
  }
56
60
  export interface RenderContext {
57
61
  slug: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACrD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/repositories/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGvE,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGhG,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,UAAU,CAAC;IACxB,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/repositories/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,UAAU,CAAC;IACxB,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/src/resource/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,wBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACzD,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GACrC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CA2B1B"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/src/resource/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,wBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACzD,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GACrC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAqB1B"}
@@ -7,8 +7,8 @@
7
7
  */
8
8
  import { createError, toError } from "../errors/veryfront-error.js";
9
9
  export function resource(config) {
10
- const pattern = config.pattern ?? generateResourcePattern();
11
- const id = patternToId(pattern);
10
+ const pattern = config.pattern ?? generateFallbackPattern();
11
+ const id = resourcePatternToId(pattern);
12
12
  return {
13
13
  id,
14
14
  pattern,
@@ -19,11 +19,7 @@ export function resource(config) {
19
19
  config.paramsSchema.parse(params);
20
20
  }
21
21
  catch (error) {
22
- const message = error instanceof Error ? error.message : String(error);
23
- throw toError(createError({
24
- type: "agent",
25
- message: `Resource "${id}" params validation failed: ${message}`,
26
- }));
22
+ throw createParamsValidationError(id, error);
27
23
  }
28
24
  return config.load(params);
29
25
  },
@@ -37,13 +33,20 @@ export function resource(config) {
37
33
  * Auto-discovery is handled by the discovery module which scans
38
34
  * the filesystem and extracts patterns from resource definitions.
39
35
  */
40
- function generateResourcePattern() {
36
+ function generateFallbackPattern() {
41
37
  return `/resource_${Date.now()}`;
42
38
  }
43
39
  /**
44
40
  * Convert path pattern to ID
45
41
  * Example: "/users/:userId/profile" -> "users_userId_profile"
46
42
  */
47
- function patternToId(pattern) {
43
+ function resourcePatternToId(pattern) {
48
44
  return pattern.replace(/^\//, "").replace(/\//g, "_").replace(/:/g, "");
49
45
  }
46
+ function createParamsValidationError(resourceId, cause) {
47
+ const message = cause instanceof Error ? cause.message : String(cause);
48
+ return toError(createError({
49
+ type: "agent",
50
+ message: `Resource "${resourceId}" params validation failed: ${message}`,
51
+ }));
52
+ }
@@ -8,13 +8,13 @@
8
8
  */
9
9
  import type { Resource } from "./types.js";
10
10
  import { ScopedRegistryFacade } from "../ai/registry-facade.js";
11
- declare class ResourceRegistryClass extends ScopedRegistryFacade<Resource> {
11
+ declare class ResourceRegistry extends ScopedRegistryFacade<Resource> {
12
12
  findByPattern(uri: string): Resource | undefined;
13
13
  private patternToRegex;
14
- private matchesPattern;
14
+ private matchPattern;
15
15
  extractParams(uri: string, pattern: string): Record<string, string>;
16
16
  list(): string[];
17
17
  }
18
- export declare const resourceRegistry: ResourceRegistryClass;
18
+ export declare const resourceRegistry: ResourceRegistry;
19
19
  export {};
20
20
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/resource/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,cAAM,qBAAsB,SAAQ,oBAAoB,CAAC,QAAQ,CAAC;IAChE,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOhD,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;IAItB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAInE,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,eAAO,MAAM,gBAAgB,uBAA6C,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/resource/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,cAAM,gBAAiB,SAAQ,oBAAoB,CAAC,QAAQ,CAAC;IAC3D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOhD,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAIpB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAInE,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,eAAO,MAAM,gBAAgB,kBAAgD,CAAC"}
@@ -8,11 +8,11 @@
8
8
  */
9
9
  import { ProjectScopedRegistryManager } from "../ai/registry-manager.js";
10
10
  import { ScopedRegistryFacade } from "../ai/registry-facade.js";
11
- const resourceManager = new ProjectScopedRegistryManager("resource");
12
- class ResourceRegistryClass extends ScopedRegistryFacade {
11
+ const resourceRegistryManager = new ProjectScopedRegistryManager("resource");
12
+ class ResourceRegistry extends ScopedRegistryFacade {
13
13
  findByPattern(uri) {
14
14
  for (const resource of this.getAll().values()) {
15
- if (this.matchesPattern(uri, resource.pattern))
15
+ if (this.matchPattern(uri, resource.pattern))
16
16
  return resource;
17
17
  }
18
18
  return undefined;
@@ -20,14 +20,14 @@ class ResourceRegistryClass extends ScopedRegistryFacade {
20
20
  patternToRegex(pattern) {
21
21
  return new RegExp(`^${pattern.replace(/:(\w+)/g, "(?<$1>[^/]+)")}$`);
22
22
  }
23
- matchesPattern(uri, pattern) {
24
- return this.patternToRegex(pattern).test(uri);
23
+ matchPattern(uri, pattern) {
24
+ return uri.match(this.patternToRegex(pattern));
25
25
  }
26
26
  extractParams(uri, pattern) {
27
- return uri.match(this.patternToRegex(pattern))?.groups ?? {};
27
+ return this.matchPattern(uri, pattern)?.groups ?? {};
28
28
  }
29
29
  list() {
30
30
  return this.getAllIds();
31
31
  }
32
32
  }
33
- export const resourceRegistry = new ResourceRegistryClass(resourceManager);
33
+ export const resourceRegistry = new ResourceRegistry(resourceRegistryManager);
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC;AAGF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AACxD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AACxD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC"}
@@ -1,11 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import { MAX_URL_LENGTH_FOR_VALIDATION } from "../utils/constants/index.js";
3
+ import { timestamp } from "./primitives.js";
4
+ const SLUG_PATTERN = /^[a-z0-9-]+$/;
5
+ const E164_PHONE_NUMBER_PATTERN = /^\+?[1-9]\d{1,14}$/;
3
6
  export const CommonSchemas = {
4
7
  email: z.string().email().max(255),
5
8
  uuid: z.string().uuid(),
6
- slug: z.string().regex(/^[a-z0-9-]+$/).min(1).max(100),
9
+ slug: z.string().regex(SLUG_PATTERN).min(1).max(100),
7
10
  url: z.string().url().max(MAX_URL_LENGTH_FOR_VALIDATION),
8
- phoneNumber: z.string().regex(/^\+?[1-9]\d{1,14}$/),
11
+ phoneNumber: z.string().regex(E164_PHONE_NUMBER_PATTERN),
9
12
  pagination: z.object({
10
13
  page: z.coerce.number().int().positive().default(1),
11
14
  limit: z.coerce.number().int().positive().max(100).default(10),
@@ -14,8 +17,8 @@ export const CommonSchemas = {
14
17
  }),
15
18
  dateRange: z
16
19
  .object({
17
- from: z.string().datetime(),
18
- to: z.string().datetime(),
20
+ from: timestamp,
21
+ to: timestamp,
19
22
  })
20
23
  .refine(({ from, to }) => new Date(from) <= new Date(to), {
21
24
  message: "From date must be before or equal to To date",
@@ -13,7 +13,6 @@ export declare class SecurityConfigLoader {
13
13
  ensureLoaded(): Promise<void>;
14
14
  private load;
15
15
  private applyConfig;
16
- private parseCspUserHeader;
17
16
  getSecurityConfig(): SecurityConfig | null;
18
17
  getCspUserHeader(): string | null;
19
18
  getCorsConfig(): SecurityConfig["cors"];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IARzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA;IAGpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAQrB,IAAI;IAWlB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,kBAAkB;IAgB1B,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;IAIvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAIjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnE,KAAK,IAAI,IAAI;CAMd"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IARzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA;IAGpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAQrB,IAAI;IAWlB,OAAO,CAAC,WAAW;IAoBnB,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;IAIvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAIjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnE,KAAK,IAAI,IAAI;CAMd"}
@@ -1,6 +1,6 @@
1
1
  import { getConfig } from "../../config/index.js";
2
2
  import { serverLogger } from "../../utils/index.js";
3
- import { buildCSP, generateNonce } from "./response/security-handler.js";
3
+ import { buildCSP, generateNonce, serializeCSPDirectives } from "./response/security-handler.js";
4
4
  const logger = serverLogger.component("security-config-loader");
5
5
  export class SecurityConfigLoader {
6
6
  projectDir;
@@ -30,7 +30,7 @@ export class SecurityConfigLoader {
30
30
  }
31
31
  catch (error) {
32
32
  // Config is optional, so we don't throw
33
- logger.debug("Failed to load config:", error);
33
+ logger.debug("Failed to load config", { error });
34
34
  this.isLoaded = true; // Mark as loaded even on error to prevent retry
35
35
  }
36
36
  }
@@ -45,22 +45,9 @@ export class SecurityConfigLoader {
45
45
  "Consider explicitly configuring security.cors and security.csrf.");
46
46
  }
47
47
  this.securityConfig = security;
48
- this.cspUserHeader = this.parseCspUserHeader(security.csp);
48
+ this.cspUserHeader = serializeCSPDirectives(security.csp);
49
49
  this.isLoaded = true;
50
50
  }
51
- parseCspUserHeader(csp) {
52
- if (!csp || typeof csp !== "object")
53
- return null;
54
- const pieces = [];
55
- for (const [k, v] of Object.entries(csp)) {
56
- if (v === undefined)
57
- continue;
58
- const key = k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
59
- const val = Array.isArray(v) ? v.join(" ") : String(v);
60
- pieces.push(`${key} ${val}`);
61
- }
62
- return pieces.length ? pieces.join("; ") : null;
63
- }
64
51
  getSecurityConfig() {
65
52
  return this.securityConfig;
66
53
  }