veryfront 0.0.84 → 0.0.88

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 (442) hide show
  1. package/README.md +18 -44
  2. package/esm/deno.d.ts +0 -1
  3. package/esm/deno.js +8 -9
  4. package/esm/deps/esm.sh/react-dom@19.1.1/client.d.ts +2 -0
  5. package/esm/deps/esm.sh/react-dom@19.1.1/client.d.ts.map +1 -0
  6. package/esm/deps/esm.sh/react-dom@19.1.1/client.js +5 -0
  7. package/esm/deps/esm.sh/react-dom@19.1.1/server.d.ts +2 -0
  8. package/esm/deps/esm.sh/react-dom@19.1.1/server.d.ts.map +1 -0
  9. package/esm/deps/esm.sh/react-dom@19.1.1/server.js +5 -0
  10. package/esm/deps/esm.sh/react@19.1.1/jsx-runtime.d.ts +2 -0
  11. package/esm/deps/esm.sh/react@19.1.1/jsx-runtime.d.ts.map +1 -0
  12. package/esm/deps/esm.sh/react@19.1.1/jsx-runtime.js +3 -0
  13. package/esm/deps/esm.sh/react@19.1.1.d.ts +2 -0
  14. package/esm/deps/esm.sh/react@19.1.1.d.ts.map +1 -0
  15. package/esm/deps/esm.sh/react@19.1.1.js +3 -0
  16. package/esm/deps/esm.sh/scheduler@^0.26.0.d.ts +2 -0
  17. package/esm/deps/esm.sh/scheduler@^0.26.0.d.ts.map +1 -0
  18. package/esm/deps/esm.sh/scheduler@^0.26.0.js +3 -0
  19. package/esm/proxy/main.d.ts +2 -0
  20. package/esm/proxy/main.d.ts.map +1 -0
  21. package/esm/proxy/main.js +400 -0
  22. package/esm/src/agent/react/use-agent.js +1 -1
  23. package/esm/src/agent/react/use-chat/use-chat.js +1 -1
  24. package/esm/src/agent/react/use-completion.js +1 -1
  25. package/esm/src/agent/react/use-streaming.js +1 -1
  26. package/esm/src/agent/react/use-voice-input.js +1 -1
  27. package/esm/src/cli/app/components/list-select.js +2 -2
  28. package/esm/src/cli/app/index.d.ts +1 -1
  29. package/esm/src/cli/app/index.d.ts.map +1 -1
  30. package/esm/src/cli/app/index.js +26 -33
  31. package/esm/src/cli/app/state.d.ts +3 -0
  32. package/esm/src/cli/app/state.d.ts.map +1 -1
  33. package/esm/src/cli/app/state.js +4 -0
  34. package/esm/src/cli/app/views/dashboard.d.ts.map +1 -1
  35. package/esm/src/cli/app/views/dashboard.js +45 -57
  36. package/esm/src/cli/app/views/startup.d.ts +39 -0
  37. package/esm/src/cli/app/views/startup.d.ts.map +1 -0
  38. package/esm/src/cli/app/views/startup.js +103 -0
  39. package/esm/src/cli/commands/init/config-generator.js +1 -1
  40. package/esm/src/cli/index/arg-parser.d.ts.map +1 -1
  41. package/esm/src/cli/index/arg-parser.js +1 -0
  42. package/esm/src/cli/index/command-router.d.ts.map +1 -1
  43. package/esm/src/cli/index/command-router.js +54 -39
  44. package/esm/src/cli/index/types.d.ts +4 -0
  45. package/esm/src/cli/index/types.d.ts.map +1 -1
  46. package/esm/src/cli/mcp/advanced-tools.d.ts +2 -2
  47. package/esm/src/cli/ui/colors.d.ts +8 -0
  48. package/esm/src/cli/ui/colors.d.ts.map +1 -1
  49. package/esm/src/cli/ui/colors.js +34 -0
  50. package/esm/src/cli/ui/dot-matrix.d.ts +8 -0
  51. package/esm/src/cli/ui/dot-matrix.d.ts.map +1 -1
  52. package/esm/src/cli/ui/dot-matrix.js +67 -2
  53. package/esm/src/config/loader.d.ts.map +1 -1
  54. package/esm/src/config/loader.js +5 -4
  55. package/esm/src/html/utils.js +2 -2
  56. package/esm/src/modules/component-registry/registry.d.ts +1 -1
  57. package/esm/src/modules/component-registry/registry.d.ts.map +1 -1
  58. package/esm/src/modules/import-map/default-import-map.d.ts +1 -11
  59. package/esm/src/modules/import-map/default-import-map.d.ts.map +1 -1
  60. package/esm/src/modules/import-map/default-import-map.js +3 -20
  61. package/esm/src/modules/import-map/loader.d.ts.map +1 -1
  62. package/esm/src/modules/import-map/loader.js +7 -22
  63. package/esm/src/modules/import-map/resolver.d.ts.map +1 -1
  64. package/esm/src/modules/import-map/resolver.js +12 -8
  65. package/esm/src/modules/react-loader/component-loader.d.ts +1 -1
  66. package/esm/src/modules/react-loader/component-loader.d.ts.map +1 -1
  67. package/esm/src/modules/react-loader/component-loader.js +2 -0
  68. package/esm/src/modules/react-loader/extract-component.d.ts +1 -1
  69. package/esm/src/modules/react-loader/extract-component.d.ts.map +1 -1
  70. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +2 -7
  71. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  72. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +68 -38
  73. package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts +2 -0
  74. package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts.map +1 -1
  75. package/esm/src/modules/react-loader/types.d.ts +3 -1
  76. package/esm/src/modules/react-loader/types.d.ts.map +1 -1
  77. package/esm/src/modules/react-loader/unified-loader.d.ts.map +1 -1
  78. package/esm/src/modules/react-loader/unified-loader.js +7 -4
  79. package/esm/src/modules/server/module-batch-handler.d.ts +2 -0
  80. package/esm/src/modules/server/module-batch-handler.d.ts.map +1 -1
  81. package/esm/src/modules/server/module-batch-handler.js +3 -1
  82. package/esm/src/modules/server/module-server.d.ts +2 -0
  83. package/esm/src/modules/server/module-server.d.ts.map +1 -1
  84. package/esm/src/modules/server/module-server.js +4 -2
  85. package/esm/src/modules/server/ssr-import-rewriter.d.ts.map +1 -1
  86. package/esm/src/modules/server/ssr-import-rewriter.js +9 -17
  87. package/esm/src/react/compat/hooks-adapter.d.ts +1 -1
  88. package/esm/src/react/compat/hooks-adapter.d.ts.map +1 -1
  89. package/esm/src/react/compat/hooks-adapter.js +1 -1
  90. package/esm/src/react/compat/ssr-adapter/response-builder.d.ts +1 -1
  91. package/esm/src/react/compat/ssr-adapter/response-builder.d.ts.map +1 -1
  92. package/esm/src/react/compat/ssr-adapter/server-loader.d.ts +5 -5
  93. package/esm/src/react/compat/ssr-adapter/server-loader.d.ts.map +1 -1
  94. package/esm/src/react/compat/ssr-adapter/server-loader.js +2 -2
  95. package/esm/src/react/compat/ssr-adapter/stream-renderer.d.ts +1 -1
  96. package/esm/src/react/compat/ssr-adapter/stream-renderer.d.ts.map +1 -1
  97. package/esm/src/react/compat/ssr-adapter/string-renderer.d.ts +1 -1
  98. package/esm/src/react/compat/ssr-adapter/string-renderer.d.ts.map +1 -1
  99. package/esm/src/react/compat/ssr-adapter/string-renderer.js +1 -1
  100. package/esm/src/react/compat/version-detector/feature-detector.js +1 -1
  101. package/esm/src/react/components/AppWrapper.d.ts +1 -1
  102. package/esm/src/react/components/AppWrapper.d.ts.map +1 -1
  103. package/esm/src/react/components/AppWrapper.js +1 -1
  104. package/esm/src/react/components/Head.d.ts +1 -1
  105. package/esm/src/react/components/Head.d.ts.map +1 -1
  106. package/esm/src/react/components/Head.js +7 -3
  107. package/esm/src/react/components/LayoutComponent.d.ts +1 -1
  108. package/esm/src/react/components/LayoutComponent.d.ts.map +1 -1
  109. package/esm/src/react/components/LayoutComponent.js +1 -1
  110. package/esm/src/react/components/Link.d.ts +1 -1
  111. package/esm/src/react/components/Link.d.ts.map +1 -1
  112. package/esm/src/react/components/Link.js +1 -1
  113. package/esm/src/react/components/MDXProvider.d.ts +1 -1
  114. package/esm/src/react/components/MDXProvider.d.ts.map +1 -1
  115. package/esm/src/react/components/MDXProvider.js +2 -2
  116. package/esm/src/react/components/ProviderComponent.d.ts +1 -1
  117. package/esm/src/react/components/ProviderComponent.d.ts.map +1 -1
  118. package/esm/src/react/components/ProviderComponent.js +1 -1
  119. package/esm/src/react/components/ai/agent-card.d.ts +2 -2
  120. package/esm/src/react/components/ai/agent-card.d.ts.map +1 -1
  121. package/esm/src/react/components/ai/agent-card.js +1 -1
  122. package/esm/src/react/components/ai/chat/components/animations.d.ts +1 -1
  123. package/esm/src/react/components/ai/chat/components/animations.d.ts.map +1 -1
  124. package/esm/src/react/components/ai/chat/components/animations.js +1 -1
  125. package/esm/src/react/components/ai/chat/components/empty-state.d.ts +1 -1
  126. package/esm/src/react/components/ai/chat/components/empty-state.d.ts.map +1 -1
  127. package/esm/src/react/components/ai/chat/components/empty-state.js +1 -1
  128. package/esm/src/react/components/ai/chat/components/message-actions.d.ts +1 -1
  129. package/esm/src/react/components/ai/chat/components/message-actions.d.ts.map +1 -1
  130. package/esm/src/react/components/ai/chat/components/message-actions.js +1 -1
  131. package/esm/src/react/components/ai/chat/components/reasoning.d.ts +1 -1
  132. package/esm/src/react/components/ai/chat/components/reasoning.d.ts.map +1 -1
  133. package/esm/src/react/components/ai/chat/components/reasoning.js +1 -1
  134. package/esm/src/react/components/ai/chat/components/tool-ui.d.ts +1 -1
  135. package/esm/src/react/components/ai/chat/components/tool-ui.d.ts.map +1 -1
  136. package/esm/src/react/components/ai/chat/components/tool-ui.js +1 -1
  137. package/esm/src/react/components/ai/chat/composition/api.d.ts +5 -4
  138. package/esm/src/react/components/ai/chat/composition/api.d.ts.map +1 -1
  139. package/esm/src/react/components/ai/chat/composition/api.js +1 -1
  140. package/esm/src/react/components/ai/chat/index.d.ts +8 -3
  141. package/esm/src/react/components/ai/chat/index.d.ts.map +1 -1
  142. package/esm/src/react/components/ai/chat/index.js +1 -1
  143. package/esm/src/react/components/ai/error-boundary.d.ts +1 -1
  144. package/esm/src/react/components/ai/error-boundary.d.ts.map +1 -1
  145. package/esm/src/react/components/ai/error-boundary.js +1 -1
  146. package/esm/src/react/components/ai/icons/index.d.ts +1 -1
  147. package/esm/src/react/components/ai/icons/index.d.ts.map +1 -1
  148. package/esm/src/react/components/ai/icons/index.js +1 -1
  149. package/esm/src/react/components/ai/markdown.d.ts +1 -1
  150. package/esm/src/react/components/ai/markdown.d.ts.map +1 -1
  151. package/esm/src/react/components/ai/markdown.js +1 -1
  152. package/esm/src/react/components/ai/message.d.ts +3 -3
  153. package/esm/src/react/components/ai/message.d.ts.map +1 -1
  154. package/esm/src/react/components/ai/message.js +1 -1
  155. package/esm/src/react/components/optimized-image/OptimizedBackgroundImage.d.ts +1 -1
  156. package/esm/src/react/components/optimized-image/OptimizedBackgroundImage.d.ts.map +1 -1
  157. package/esm/src/react/components/optimized-image/OptimizedBackgroundImage.js +1 -1
  158. package/esm/src/react/components/optimized-image/OptimizedImage.d.ts +1 -1
  159. package/esm/src/react/components/optimized-image/OptimizedImage.d.ts.map +1 -1
  160. package/esm/src/react/components/optimized-image/OptimizedImage.js +1 -1
  161. package/esm/src/react/components/optimized-image/SimpleOptimizedImage.d.ts +1 -1
  162. package/esm/src/react/components/optimized-image/SimpleOptimizedImage.d.ts.map +1 -1
  163. package/esm/src/react/components/optimized-image/utils.d.ts +1 -1
  164. package/esm/src/react/components/optimized-image/utils.d.ts.map +1 -1
  165. package/esm/src/react/components/optimized-image/utils.js +1 -1
  166. package/esm/src/react/context/index.d.ts +1 -1
  167. package/esm/src/react/context/index.d.ts.map +1 -1
  168. package/esm/src/react/context/index.js +1 -1
  169. package/esm/src/react/fonts/index.d.ts +1 -1
  170. package/esm/src/react/fonts/index.d.ts.map +1 -1
  171. package/esm/src/react/fonts/index.js +1 -1
  172. package/esm/src/react/primitives/agent-primitives.d.ts +4 -4
  173. package/esm/src/react/primitives/agent-primitives.d.ts.map +1 -1
  174. package/esm/src/react/primitives/agent-primitives.js +1 -1
  175. package/esm/src/react/primitives/chat-container.d.ts +2 -2
  176. package/esm/src/react/primitives/chat-container.d.ts.map +1 -1
  177. package/esm/src/react/primitives/chat-container.js +1 -1
  178. package/esm/src/react/primitives/input-box.d.ts +4 -4
  179. package/esm/src/react/primitives/input-box.d.ts.map +1 -1
  180. package/esm/src/react/primitives/input-box.js +7 -3
  181. package/esm/src/react/primitives/message-list.d.ts +5 -5
  182. package/esm/src/react/primitives/message-list.d.ts.map +1 -1
  183. package/esm/src/react/primitives/message-list.js +1 -1
  184. package/esm/src/react/primitives/tool-primitives.d.ts +4 -4
  185. package/esm/src/react/primitives/tool-primitives.d.ts.map +1 -1
  186. package/esm/src/react/primitives/tool-primitives.js +1 -1
  187. package/esm/src/react/router/index.d.ts +1 -1
  188. package/esm/src/react/router/index.d.ts.map +1 -1
  189. package/esm/src/react/router/index.js +1 -1
  190. package/esm/src/rendering/app-reserved.d.ts +1 -1
  191. package/esm/src/rendering/app-reserved.d.ts.map +1 -1
  192. package/esm/src/rendering/app-reserved.js +1 -1
  193. package/esm/src/rendering/client/router.js +1 -1
  194. package/esm/src/rendering/client/state-bridge.d.ts +1 -1
  195. package/esm/src/rendering/client/state-bridge.d.ts.map +1 -1
  196. package/esm/src/rendering/client/state-bridge.js +1 -1
  197. package/esm/src/rendering/component-handling.d.ts +3 -1
  198. package/esm/src/rendering/component-handling.d.ts.map +1 -1
  199. package/esm/src/rendering/component-handling.js +4 -2
  200. package/esm/src/rendering/element-validator/element-normalizer.d.ts +1 -1
  201. package/esm/src/rendering/element-validator/element-normalizer.d.ts.map +1 -1
  202. package/esm/src/rendering/element-validator/element-normalizer.js +1 -1
  203. package/esm/src/rendering/element-validator/primitive-checks.d.ts +1 -1
  204. package/esm/src/rendering/element-validator/primitive-checks.d.ts.map +1 -1
  205. package/esm/src/rendering/element-validator/primitive-checks.js +1 -1
  206. package/esm/src/rendering/element-validator/validator-core.d.ts +1 -1
  207. package/esm/src/rendering/element-validator/validator-core.d.ts.map +1 -1
  208. package/esm/src/rendering/layouts/layout-applicator.d.ts +1 -1
  209. package/esm/src/rendering/layouts/layout-applicator.d.ts.map +1 -1
  210. package/esm/src/rendering/layouts/layout-applicator.js +2 -0
  211. package/esm/src/rendering/layouts/utils/applicator.d.ts +1 -1
  212. package/esm/src/rendering/layouts/utils/applicator.d.ts.map +1 -1
  213. package/esm/src/rendering/layouts/utils/component-loader.d.ts +1 -1
  214. package/esm/src/rendering/layouts/utils/component-loader.d.ts.map +1 -1
  215. package/esm/src/rendering/layouts/utils/ensure-valid-child.d.ts +1 -1
  216. package/esm/src/rendering/layouts/utils/ensure-valid-child.d.ts.map +1 -1
  217. package/esm/src/rendering/orchestrator/layout.d.ts +1 -1
  218. package/esm/src/rendering/orchestrator/layout.d.ts.map +1 -1
  219. package/esm/src/rendering/orchestrator/module-loader/index.d.ts +3 -0
  220. package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
  221. package/esm/src/rendering/orchestrator/module-loader/index.js +74 -19
  222. package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
  223. package/esm/src/rendering/orchestrator/pipeline.js +2 -0
  224. package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts +1 -1
  225. package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts.map +1 -1
  226. package/esm/src/rendering/page-renderer.d.ts +1 -1
  227. package/esm/src/rendering/page-renderer.d.ts.map +1 -1
  228. package/esm/src/rendering/page-rendering.d.ts +1 -1
  229. package/esm/src/rendering/page-rendering.d.ts.map +1 -1
  230. package/esm/src/rendering/rsc/server-renderer/component-detector.d.ts +1 -1
  231. package/esm/src/rendering/rsc/server-renderer/component-detector.d.ts.map +1 -1
  232. package/esm/src/rendering/rsc/server-renderer/rsc-renderer.d.ts +1 -1
  233. package/esm/src/rendering/rsc/server-renderer/rsc-renderer.d.ts.map +1 -1
  234. package/esm/src/rendering/rsc/server-renderer/tree-processor.d.ts +1 -1
  235. package/esm/src/rendering/rsc/server-renderer/tree-processor.d.ts.map +1 -1
  236. package/esm/src/rendering/rsc/server-renderer/tree-processor.js +4 -2
  237. package/esm/src/rendering/snippet-renderer.js +2 -2
  238. package/esm/src/rendering/ssr/component-registry.d.ts +1 -1
  239. package/esm/src/rendering/ssr/component-registry.d.ts.map +1 -1
  240. package/esm/src/rendering/ssr/component-registry.js +1 -1
  241. package/esm/src/rendering/ssr-renderer.d.ts +1 -1
  242. package/esm/src/rendering/ssr-renderer.d.ts.map +1 -1
  243. package/esm/src/rendering/utils/react-helpers.d.ts +1 -1
  244. package/esm/src/rendering/utils/react-helpers.d.ts.map +1 -1
  245. package/esm/src/rendering/utils/react-helpers.js +1 -1
  246. package/esm/src/server/handlers/request/ssr/error-page-fallback.js +1 -1
  247. package/esm/src/server/handlers/request/ssr/not-found-fallback.js +1 -1
  248. package/esm/src/transforms/esm/http-bundler.d.ts +15 -4
  249. package/esm/src/transforms/esm/http-bundler.d.ts.map +1 -1
  250. package/esm/src/transforms/esm/http-bundler.js +105 -12
  251. package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
  252. package/esm/src/transforms/esm/http-cache.js +51 -44
  253. package/esm/src/transforms/esm/import-rewriter.d.ts.map +1 -1
  254. package/esm/src/transforms/esm/import-rewriter.js +3 -3
  255. package/esm/src/transforms/esm/package-registry.d.ts +15 -13
  256. package/esm/src/transforms/esm/package-registry.d.ts.map +1 -1
  257. package/esm/src/transforms/esm/package-registry.js +45 -32
  258. package/esm/src/transforms/esm/react-imports.d.ts.map +1 -1
  259. package/esm/src/transforms/esm/react-imports.js +3 -7
  260. package/esm/src/transforms/esm/types.d.ts +2 -0
  261. package/esm/src/transforms/esm/types.d.ts.map +1 -1
  262. package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts +14 -0
  263. package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts.map +1 -1
  264. package/esm/src/transforms/mdx/esm-module-loader/cache/index.js +67 -0
  265. package/esm/src/transforms/mdx/esm-module-loader/loader.d.ts.map +1 -1
  266. package/esm/src/transforms/mdx/esm-module-loader/loader.js +1 -1
  267. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts +1 -0
  268. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
  269. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +1 -0
  270. package/esm/src/transforms/mdx/esm-module-loader/types.d.ts +4 -0
  271. package/esm/src/transforms/mdx/esm-module-loader/types.d.ts.map +1 -1
  272. package/esm/src/transforms/mdx/index.d.ts +1 -1
  273. package/esm/src/transforms/mdx/index.d.ts.map +1 -1
  274. package/esm/src/transforms/mdx/index.js +1 -1
  275. package/esm/src/transforms/mdx/mdx-cache-adapter.js +1 -1
  276. package/esm/src/transforms/mdx/module-loader/types.d.ts +1 -1
  277. package/esm/src/transforms/mdx/module-loader/types.d.ts.map +1 -1
  278. package/esm/src/transforms/mdx/types.d.ts +2 -2
  279. package/esm/src/transforms/mdx/types.d.ts.map +1 -1
  280. package/esm/src/transforms/pipeline/context.d.ts.map +1 -1
  281. package/esm/src/transforms/pipeline/context.js +7 -15
  282. package/esm/src/transforms/pipeline/stages/finalize.d.ts.map +1 -1
  283. package/esm/src/transforms/pipeline/stages/finalize.js +1 -1
  284. package/esm/src/types/app.d.ts +1 -1
  285. package/esm/src/types/app.d.ts.map +1 -1
  286. package/esm/src/types/global-guards.d.ts +1 -1
  287. package/esm/src/types/global-guards.d.ts.map +1 -1
  288. package/esm/src/types/index.d.ts +1 -1
  289. package/esm/src/types/index.d.ts.map +1 -1
  290. package/esm/src/utils/constants/cdn.d.ts.map +1 -1
  291. package/esm/src/utils/constants/cdn.js +22 -11
  292. package/esm/src/utils/hash-utils.d.ts +2 -0
  293. package/esm/src/utils/hash-utils.d.ts.map +1 -1
  294. package/esm/src/utils/hash-utils.js +4 -0
  295. package/esm/src/workflow/react/use-approval.js +1 -1
  296. package/esm/src/workflow/react/use-workflow-list.js +1 -1
  297. package/esm/src/workflow/react/use-workflow-start.js +1 -1
  298. package/esm/src/workflow/react/use-workflow.js +1 -1
  299. package/package.json +2 -1
  300. package/src/deno.js +8 -9
  301. package/src/deps/esm.sh/@types/react-dom@19.1.11/X-ZGNzc3R5cGVAMy4yLjMKZXJlYWN0/client.d.ts +105 -0
  302. package/src/deps/esm.sh/@types/react-dom@19.1.11/X-ZGNzc3R5cGVAMy4yLjMKZXJlYWN0/server.d.ts +162 -0
  303. package/src/deps/esm.sh/@types/react@19.1.17/X-ZGNzc3R5cGVAMy4yLjM/global.d.ts +165 -0
  304. package/src/deps/esm.sh/@types/react@19.1.17/X-ZGNzc3R5cGVAMy4yLjM/index.d.ts +4267 -0
  305. package/src/deps/esm.sh/@types/react@19.1.17/X-ZGNzc3R5cGVAMy4yLjMKZXJlYWN0/global.d.ts +165 -0
  306. package/src/deps/esm.sh/@types/react@19.1.17/X-ZGNzc3R5cGVAMy4yLjMKZXJlYWN0/index.d.ts +4267 -0
  307. package/src/deps/esm.sh/@types/react@19.1.17/X-ZGNzc3R5cGVAMy4yLjMKZXJlYWN0/jsx-runtime.d.ts +36 -0
  308. package/src/deps/esm.sh/@types/scheduler@0.26.0/index.d.ts +30 -0
  309. package/src/deps/esm.sh/csstype@3.2.3/index.d.ts +22569 -0
  310. package/src/deps/esm.sh/react-dom@19.1.1/client.d.ts +105 -0
  311. package/src/deps/esm.sh/react-dom@19.1.1/client.js +5 -0
  312. package/src/deps/esm.sh/react-dom@19.1.1/server.d.ts +162 -0
  313. package/src/deps/esm.sh/react-dom@19.1.1/server.js +5 -0
  314. package/src/deps/esm.sh/react@19.1.1/jsx-runtime.d.ts +36 -0
  315. package/src/deps/esm.sh/react@19.1.1/jsx-runtime.js +3 -0
  316. package/src/deps/esm.sh/react@19.1.1.d.ts +4267 -0
  317. package/src/deps/esm.sh/react@19.1.1.js +3 -0
  318. package/src/deps/esm.sh/scheduler@^0.26.0.d.ts +30 -0
  319. package/src/deps/esm.sh/scheduler@^0.26.0.js +3 -0
  320. package/src/proxy/main.ts +471 -0
  321. package/src/src/agent/react/use-agent.ts +1 -1
  322. package/src/src/agent/react/use-chat/use-chat.ts +1 -1
  323. package/src/src/agent/react/use-completion.ts +1 -1
  324. package/src/src/agent/react/use-streaming.ts +1 -1
  325. package/src/src/agent/react/use-voice-input.ts +1 -1
  326. package/src/src/cli/app/components/list-select.ts +2 -2
  327. package/src/src/cli/app/index.ts +34 -35
  328. package/src/src/cli/app/state.ts +7 -0
  329. package/src/src/cli/app/views/dashboard.ts +46 -60
  330. package/src/src/cli/app/views/startup.ts +132 -0
  331. package/src/src/cli/commands/init/config-generator.ts +1 -1
  332. package/src/src/cli/index/arg-parser.ts +1 -0
  333. package/src/src/cli/index/command-router.ts +57 -40
  334. package/src/src/cli/index/types.ts +5 -0
  335. package/src/src/cli/ui/colors.ts +37 -0
  336. package/src/src/cli/ui/dot-matrix.ts +77 -1
  337. package/src/src/config/loader.ts +5 -4
  338. package/src/src/html/utils.ts +2 -2
  339. package/src/src/modules/component-registry/registry.ts +1 -1
  340. package/src/src/modules/import-map/default-import-map.ts +3 -25
  341. package/src/src/modules/import-map/loader.ts +7 -23
  342. package/src/src/modules/import-map/resolver.ts +13 -8
  343. package/src/src/modules/react-loader/component-loader.ts +3 -1
  344. package/src/src/modules/react-loader/extract-component.ts +1 -1
  345. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +95 -68
  346. package/src/src/modules/react-loader/ssr-module-loader/types.ts +2 -0
  347. package/src/src/modules/react-loader/types.ts +3 -1
  348. package/src/src/modules/react-loader/unified-loader.ts +7 -4
  349. package/src/src/modules/server/module-batch-handler.ts +7 -0
  350. package/src/src/modules/server/module-server.ts +6 -1
  351. package/src/src/modules/server/ssr-import-rewriter.ts +9 -17
  352. package/src/src/react/compat/hooks-adapter.ts +1 -1
  353. package/src/src/react/compat/ssr-adapter/response-builder.ts +1 -1
  354. package/src/src/react/compat/ssr-adapter/server-loader.ts +10 -10
  355. package/src/src/react/compat/ssr-adapter/stream-renderer.ts +2 -2
  356. package/src/src/react/compat/ssr-adapter/string-renderer.ts +3 -3
  357. package/src/src/react/compat/version-detector/feature-detector.ts +1 -1
  358. package/src/src/react/components/AppWrapper.tsx +1 -1
  359. package/src/src/react/components/Head.tsx +7 -3
  360. package/src/src/react/components/LayoutComponent.tsx +2 -2
  361. package/src/src/react/components/Link.tsx +1 -1
  362. package/src/src/react/components/MDXProvider.tsx +2 -2
  363. package/src/src/react/components/ProviderComponent.tsx +2 -2
  364. package/src/src/react/components/ai/agent-card.tsx +1 -1
  365. package/src/src/react/components/ai/chat/components/animations.tsx +1 -1
  366. package/src/src/react/components/ai/chat/components/empty-state.tsx +1 -1
  367. package/src/src/react/components/ai/chat/components/message-actions.tsx +1 -1
  368. package/src/src/react/components/ai/chat/components/reasoning.tsx +1 -1
  369. package/src/src/react/components/ai/chat/components/tool-ui.tsx +1 -1
  370. package/src/src/react/components/ai/chat/composition/api.tsx +1 -1
  371. package/src/src/react/components/ai/chat/index.tsx +1 -1
  372. package/src/src/react/components/ai/error-boundary.tsx +1 -1
  373. package/src/src/react/components/ai/icons/index.ts +1 -1
  374. package/src/src/react/components/ai/markdown.tsx +1 -1
  375. package/src/src/react/components/ai/message.tsx +1 -1
  376. package/src/src/react/components/optimized-image/OptimizedBackgroundImage.tsx +1 -1
  377. package/src/src/react/components/optimized-image/OptimizedImage.tsx +1 -1
  378. package/src/src/react/components/optimized-image/SimpleOptimizedImage.tsx +1 -1
  379. package/src/src/react/components/optimized-image/utils.tsx +1 -1
  380. package/src/src/react/context/index.ts +1 -1
  381. package/src/src/react/fonts/index.ts +1 -1
  382. package/src/src/react/primitives/agent-primitives.tsx +1 -1
  383. package/src/src/react/primitives/chat-container.tsx +1 -1
  384. package/src/src/react/primitives/input-box.tsx +5 -3
  385. package/src/src/react/primitives/message-list.tsx +1 -1
  386. package/src/src/react/primitives/tool-primitives.tsx +1 -1
  387. package/src/src/react/router/index.ts +1 -1
  388. package/src/src/rendering/app-reserved.ts +1 -1
  389. package/src/src/rendering/client/router.ts +2 -2
  390. package/src/src/rendering/client/state-bridge.ts +2 -2
  391. package/src/src/rendering/component-handling.ts +7 -1
  392. package/src/src/rendering/element-validator/element-inspector.ts +1 -1
  393. package/src/src/rendering/element-validator/element-normalizer.ts +1 -1
  394. package/src/src/rendering/element-validator/primitive-checks.ts +1 -1
  395. package/src/src/rendering/element-validator/validator-core.ts +1 -1
  396. package/src/src/rendering/layouts/layout-applicator.ts +5 -6
  397. package/src/src/rendering/layouts/utils/applicator.ts +1 -1
  398. package/src/src/rendering/layouts/utils/component-loader.ts +1 -1
  399. package/src/src/rendering/layouts/utils/ensure-valid-child.ts +1 -1
  400. package/src/src/rendering/orchestrator/layout.ts +1 -1
  401. package/src/src/rendering/orchestrator/module-loader/index.ts +91 -20
  402. package/src/src/rendering/orchestrator/pipeline.ts +2 -0
  403. package/src/src/rendering/orchestrator/ssr-orchestrator.ts +2 -2
  404. package/src/src/rendering/page-renderer.ts +1 -1
  405. package/src/src/rendering/page-rendering.ts +1 -1
  406. package/src/src/rendering/rsc/server-renderer/component-detector.ts +1 -1
  407. package/src/src/rendering/rsc/server-renderer/rsc-renderer.ts +1 -1
  408. package/src/src/rendering/rsc/server-renderer/tree-processor.ts +14 -4
  409. package/src/src/rendering/snippet-renderer.ts +2 -2
  410. package/src/src/rendering/ssr/component-registry.ts +1 -1
  411. package/src/src/rendering/ssr-renderer.ts +1 -1
  412. package/src/src/rendering/utils/react-helpers.ts +1 -1
  413. package/src/src/server/build-app-route-renderer.ts +2 -2
  414. package/src/src/server/handlers/request/rsc/handlers/render-handler.ts +1 -1
  415. package/src/src/server/handlers/request/ssr/error-page-fallback.ts +2 -2
  416. package/src/src/server/handlers/request/ssr/not-found-fallback.ts +1 -1
  417. package/src/src/transforms/esm/http-bundler.ts +101 -11
  418. package/src/src/transforms/esm/http-cache.ts +53 -45
  419. package/src/src/transforms/esm/import-rewriter.ts +5 -3
  420. package/src/src/transforms/esm/package-registry.ts +46 -32
  421. package/src/src/transforms/esm/react-imports.ts +3 -7
  422. package/src/src/transforms/esm/types.ts +2 -0
  423. package/src/src/transforms/mdx/esm-module-loader/cache/index.ts +84 -0
  424. package/src/src/transforms/mdx/esm-module-loader/loader.ts +2 -1
  425. package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +2 -1
  426. package/src/src/transforms/mdx/esm-module-loader/types.ts +4 -0
  427. package/src/src/transforms/mdx/index.ts +1 -1
  428. package/src/src/transforms/mdx/mdx-cache-adapter.ts +1 -1
  429. package/src/src/transforms/mdx/module-loader/types.ts +1 -1
  430. package/src/src/transforms/mdx/types.ts +2 -2
  431. package/src/src/transforms/pipeline/context.ts +7 -18
  432. package/src/src/transforms/pipeline/stages/finalize.ts +6 -1
  433. package/src/src/transforms/plugins/babel-node-positions.ts +2 -2
  434. package/src/src/types/app.ts +1 -1
  435. package/src/src/types/global-guards.ts +1 -1
  436. package/src/src/types/index.ts +1 -1
  437. package/src/src/utils/constants/cdn.ts +21 -12
  438. package/src/src/utils/hash-utils.ts +5 -0
  439. package/src/src/workflow/react/use-approval.ts +1 -1
  440. package/src/src/workflow/react/use-workflow-list.ts +1 -1
  441. package/src/src/workflow/react/use-workflow-start.ts +1 -1
  442. package/src/src/workflow/react/use-workflow.ts +1 -1
@@ -19,9 +19,16 @@ import { join } from "../../platform/compat/path/index.js";
19
19
  import { getRuntimeEnv } from "../../config/runtime-env.js";
20
20
  import { getStdinReader, setRawMode } from "../../platform/compat/stdin.js";
21
21
  import { cursor, screen, SPINNER_FRAMES } from "../ui/ansi.js";
22
- import { brand, dim, success } from "../ui/colors.js";
22
+ import { brand, dim } from "../ui/colors.js";
23
+ import { getTerminalWidth } from "../ui/layout.js";
23
24
  import { moveDown, moveUp, selectByNumber } from "./components/list-select.js";
24
25
  import { renderDashboard, renderEmptyState } from "./views/dashboard.js";
26
+ import {
27
+ createStartupState,
28
+ incrementFrame,
29
+ renderStartup,
30
+ setStepActive,
31
+ } from "./views/startup.js";
25
32
  import { openInBrowser, openInIDE, openInStudio, openMCPSettings } from "./actions.js";
26
33
  import { initCommand } from "../commands/init/init-command.js";
27
34
  import type { InitTemplate } from "../commands/init/types.js";
@@ -42,6 +49,7 @@ import {
42
49
  setTemplates,
43
50
  startInput,
44
51
  type StateUpdater,
52
+ toggleHelp,
45
53
  toggleLogsExpanded,
46
54
  updateActiveList,
47
55
  updateInputValue,
@@ -545,10 +553,13 @@ export function createApp(config: AppConfig): App {
545
553
 
546
554
  const parts: string[] = [content];
547
555
 
556
+ // Divider width matches the box in dashboard
557
+ const dividerWidth = Math.min(getTerminalWidth() - 4, 80);
558
+
548
559
  if (state.logs.length > 0) {
549
560
  const logsHeader = state.logsExpanded ? "▼ Logs" : "▶ Logs";
550
561
  parts.push("");
551
- parts.push(` ${dim("─".repeat(60))}`);
562
+ parts.push(dim("─".repeat(dividerWidth)));
552
563
  parts.push(
553
564
  ` ${dim(logsHeader)} ${dim(`(${state.logs.length})`)} ${dim("l")} ${dim("toggle")} ${
554
565
  state.logsExpanded ? `${dim("↑↓")} ${dim("scroll")}` : ""
@@ -563,14 +574,14 @@ export function createApp(config: AppConfig): App {
563
574
 
564
575
  if (state.input.active) {
565
576
  parts.push("");
566
- parts.push(` ${dim("─".repeat(60))}`);
577
+ parts.push(dim("─".repeat(dividerWidth)));
567
578
  parts.push(renderInput(state.input));
568
579
  }
569
580
 
570
581
  if (!isInteractiveMode) return;
571
582
 
572
583
  write(cursor.moveTo(1, 1) + screen.clearDown);
573
- write(parts.join("\n"));
584
+ write("\n" + parts.join("\n"));
574
585
  }
575
586
 
576
587
  function update(updater: StateUpdater): void {
@@ -933,7 +944,7 @@ export function createApp(config: AppConfig): App {
933
944
  }
934
945
 
935
946
  if (key === "?") {
936
- update(navigateTo("help"));
947
+ update(toggleHelp());
937
948
  return;
938
949
  }
939
950
 
@@ -1422,47 +1433,35 @@ export function createApp(config: AppConfig): App {
1422
1433
  }
1423
1434
 
1424
1435
  /**
1425
- * Show startup animation
1436
+ * Show startup animation with boxed view and shimmer effect
1426
1437
  */
1427
1438
  export async function showStartup(steps: string[]): Promise<void> {
1428
1439
  const write = (text: string): void => writeStdout(text);
1429
1440
 
1430
1441
  write(screen.altOn + cursor.hide);
1431
1442
 
1432
- for (let i = 0; i < steps.length; i++) {
1433
- const step = steps[i]!;
1434
- const completed = steps.slice(0, i).map((s) => ` ${success("✓")} ${dim(s)}`);
1435
- const current = ` ${brand("●")} ${step}`;
1436
- const pending = steps.slice(i + 1).map((s) => ` ${dim("○")} ${dim(s)}`);
1437
-
1438
- const content = [
1439
- "",
1440
- ` ${brand("Veryfront")} ${dim("starting...")}`,
1441
- "",
1442
- ...completed,
1443
- current,
1444
- ...pending,
1445
- "",
1446
- ].join("\n");
1443
+ let startupState = createStartupState(steps);
1447
1444
 
1448
- write(cursor.moveTo(1, 1) + screen.clearDown + content);
1449
- await new Promise((r) => dntShim.setTimeout(r, 200));
1445
+ // Show each step with spinning avatar animation
1446
+ for (let i = 0; i < steps.length; i++) {
1447
+ startupState = setStepActive(startupState, i);
1448
+
1449
+ // Animate spinning avatar (16 frames at 60ms = ~1s per step for full rotation)
1450
+ const framesPerStep = 16;
1451
+ for (let f = 0; f < framesPerStep; f++) {
1452
+ write(cursor.moveTo(1, 1) + screen.clearDown + "\n" + renderStartup(startupState));
1453
+ startupState = incrementFrame(startupState);
1454
+ await new Promise((r) => dntShim.setTimeout(r, 60));
1455
+ }
1450
1456
  }
1451
1457
 
1452
- const allComplete = steps.map((s) => ` ${success("✓")} ${dim(s)}`);
1453
- const finalContent = [
1454
- "",
1455
- ` ${brand("Veryfront")} ${success("ready")}`,
1456
- "",
1457
- ...allComplete,
1458
- "",
1459
- ].join("\n");
1460
-
1461
- write(cursor.moveTo(1, 1) + screen.clearDown + finalContent);
1462
- await new Promise((r) => dntShim.setTimeout(r, 300));
1458
+ // Mark all steps done - logo fills up and holds before transitioning
1459
+ startupState = setStepActive(startupState, steps.length);
1460
+ write(cursor.moveTo(1, 1) + screen.clearDown + "\n" + renderStartup(startupState));
1461
+ await new Promise((r) => dntShim.setTimeout(r, 400));
1463
1462
 
1464
1463
  // Don't exit alternate screen - let app.start() continue in it
1465
- // This prevents a flash when transitioning to the dashboard
1464
+ // Dashboard takes over directly from here
1466
1465
  }
1467
1466
 
1468
1467
  export type { AppState } from "./state.js";
@@ -103,6 +103,8 @@ export interface AppState {
103
103
  authProviderIndex: number;
104
104
  /** New project option index (0=template, 1=example, 2=scratch) */
105
105
  newProjectIndex: number;
106
+ /** Show expanded help */
107
+ showHelp: boolean;
106
108
  }
107
109
 
108
110
  export function createInitialState(): AppState {
@@ -153,6 +155,7 @@ export function createInitialState(): AppState {
153
155
  logScroll: 0,
154
156
  authProviderIndex: 0,
155
157
  newProjectIndex: 0,
158
+ showHelp: false,
156
159
  };
157
160
  }
158
161
 
@@ -339,6 +342,10 @@ export function toggleLogsExpanded(): StateUpdater {
339
342
  });
340
343
  }
341
344
 
345
+ export function toggleHelp(): StateUpdater {
346
+ return (state) => ({ ...state, showHelp: !state.showHelp });
347
+ }
348
+
342
349
  export function scrollLogs(direction: "up" | "down"): StateUpdater {
343
350
  return (state) => {
344
351
  if (!state.logsExpanded) return state;
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { box } from "../../ui/box.js";
8
- import { brand, dim, error, muted, success } from "../../ui/colors.js";
8
+ import { brand, dim, error, muted } from "../../ui/colors.js";
9
9
  import { getTerminalWidth } from "../../ui/layout.js";
10
10
  import { getAgentFaceWithText } from "../../ui/dot-matrix.js";
11
11
  import { renderList } from "../components/list-select.js";
@@ -27,7 +27,7 @@ export function renderDashboard(state: AppState): string {
27
27
 
28
28
  if (hasProjects) {
29
29
  const isActive = state.activeList === "projects";
30
- lines.push(renderSection("Local Projects", state.projects.items.length, isActive));
30
+ lines.push(renderSection("Local", state.projects.items.length, isActive));
31
31
  lines.push(
32
32
  renderList(state.projects, {
33
33
  maxWidth: maxListWidth,
@@ -47,10 +47,10 @@ export function renderDashboard(state: AppState): string {
47
47
  const end = Math.min(start + visibleCount, state.remote.projects.length);
48
48
  const visibleProjects = state.remote.projects.slice(start, end);
49
49
 
50
- lines.push(renderSection("Remote Projects", state.remote.projects.length, isRemoteActive));
50
+ lines.push(renderSection("Remote", state.remote.projects.length, isRemoteActive));
51
51
 
52
52
  if (start > 0) {
53
- lines.push(` ${dim("more above")}`);
53
+ lines.push(` ${dim("↑")} ${dim("more above")}`);
54
54
  }
55
55
 
56
56
  visibleProjects.forEach((p, i) => {
@@ -68,7 +68,7 @@ export function renderDashboard(state: AppState): string {
68
68
  });
69
69
 
70
70
  if (end < state.remote.projects.length) {
71
- lines.push(` ${dim("more below")}`);
71
+ lines.push(` ${dim("↓")} ${dim("more below")}`);
72
72
  }
73
73
  lines.push("");
74
74
  }
@@ -93,27 +93,26 @@ export function renderDashboard(state: AppState): string {
93
93
  }
94
94
 
95
95
  /**
96
- * Render the banner with agent face and server info
96
+ * Render the banner with agent face and server info inside a box
97
97
  */
98
98
  function renderBanner(state: AppState): string {
99
- const serverDot = state.server.running ? success("●") : error("●");
100
- const mcpDot = state.mcp.enabled ? success("●") : dim("○");
101
-
99
+ const termWidth = Math.min(getTerminalWidth() - 4, 80);
102
100
  const textLines: string[] = [];
103
101
 
104
- textLines.push(`${serverDot} ${dim("Server running")}`);
105
- textLines.push(` ${brand(state.server.url)}`);
102
+ textLines.push("");
103
+ textLines.push(`${brand("Veryfront Code")} ${dim("is now running")}`);
104
+ textLines.push("");
106
105
 
107
- if (state.mcp.enabled) {
108
- textLines.push(`${mcpDot} ${dim("MCP")}`);
109
- if (state.mcp.transport === "http") {
110
- const port = state.mcp.httpPort ?? 9999;
111
- textLines.push(` ${brand(`http://veryfront.me:${port}/mcp`)}`);
112
- } else {
113
- textLines.push(` ${dim("stdio")}`);
114
- }
106
+ // Server URL and MCP URL - always reserve both lines to prevent jumps
107
+ textLines.push(`${dim("Url")} ${brand(state.server.url)}`);
108
+ if (state.mcp.enabled && state.mcp.transport === "http") {
109
+ const port = state.mcp.httpPort ?? 9999;
110
+ textLines.push(`${dim("Mcp")} ${brand(`http://veryfront.me:${port}/mcp`)}`);
111
+ } else {
112
+ textLines.push("");
115
113
  }
116
114
 
115
+ // Errors/warnings on separate line if any
117
116
  const { errors, warnings } = state.server;
118
117
  if (errors > 0 || warnings > 0) {
119
118
  const parts: string[] = [];
@@ -122,58 +121,56 @@ function renderBanner(state: AppState): string {
122
121
  textLines.push(parts.join(" "));
123
122
  }
124
123
 
125
- return getAgentFaceWithText(textLines, {
124
+ // Pad to 7 text lines (matching avatar height) for consistent title position
125
+ while (textLines.length < 7) {
126
+ textLines.push("");
127
+ }
128
+
129
+ const content = getAgentFaceWithText(textLines, {
126
130
  litColor: "\x1b[38;2;252;143;93m", // Veryfront brand orange
127
131
  });
132
+
133
+ return box(content, {
134
+ style: "rounded",
135
+ width: termWidth,
136
+ paddingX: 2,
137
+ paddingY: 1,
138
+ borderColor: "\x1b[2m", // Dim to match footer
139
+ });
128
140
  }
129
141
 
130
142
  /**
131
143
  * Render a section header
132
144
  */
133
- function renderSection(title: string, count: number, isActive = true): string {
145
+ function renderSection(title: string, _count: number, isActive = true): string {
134
146
  const indicator = isActive ? brand("›") : " ";
135
147
  const titleText = isActive ? title : dim(title);
136
- return ` ${indicator} ${titleText} ${dim(`(${count})`)}`;
148
+ return ` ${indicator} ${titleText}`;
137
149
  }
138
150
 
139
151
  /**
140
152
  * Render the help bar at the bottom
141
153
  */
142
154
  function renderHelpBar(state: AppState): string {
143
- const parts: string[] = [];
144
-
145
- const hasProjects = state.projects.items.length > 0;
146
- const hasExamples = state.examples.items.length > 0;
147
- const hasRemoteProjects = state.remote.user && state.remote.projects.length > 0;
148
-
149
- // Count sections for tab switching
150
- const sectionCount = [hasProjects, hasExamples, hasRemoteProjects].filter(Boolean).length;
151
-
152
- if (sectionCount > 1) {
153
- parts.push(dim("tab switch"));
155
+ // Minimal by default, ? reveals all
156
+ if (!state.showHelp) {
157
+ const userInfo = state.remote.user ? ` ${dim("-")} ${brand(state.remote.user.email)}` : "";
158
+ return ` ${dim("↑↓ select enter open ? more q quit")}${userInfo}`;
154
159
  }
155
160
 
156
- parts.push(dim("↑↓ nav"));
157
-
158
- if (hasProjects || hasExamples || hasRemoteProjects) {
159
- parts.push(dim("o open"), dim("s studio"), dim("i ide"));
160
- }
161
+ // Expanded help
162
+ const lines: string[] = [];
163
+ lines.push(` ${dim("o")} open ${dim("s")} studio ${dim("i")} ide`);
161
164
 
162
165
  if (!state.remote.user) {
163
- parts.push(dim("a login"));
166
+ lines.push(` ${dim("n")} new ${dim("a")} login`);
164
167
  } else {
165
- // Show context-aware actions based on active list
166
- if (state.activeList === "projects") {
167
- parts.push(dim("p pull"), dim("u push"));
168
- } else if (state.activeList === "remoteProjects") {
169
- parts.push(dim("p pull"));
170
- }
171
- parts.push(dim("n new"), dim("x logout"));
168
+ lines.push(` ${dim("n")} new ${dim("p")} pull ${dim("u")} push ${dim("x")} logout`);
172
169
  }
173
170
 
174
- parts.push(dim("? help"), dim("q quit"));
171
+ lines.push(` ${dim("? hide q quit")}`);
175
172
 
176
- return ` ${parts.join(" ")}`;
173
+ return lines.join("\n");
177
174
  }
178
175
 
179
176
  /**
@@ -197,16 +194,5 @@ export function renderDashboardBoxed(state: AppState): string {
197
194
  * Render empty state when no projects found
198
195
  */
199
196
  export function renderEmptyState(): string {
200
- return [
201
- "",
202
- ` ${dim("No projects found.")}`,
203
- "",
204
- ` ${dim("Get started:")}`,
205
- ` ${brand("[n]")} Create a new project`,
206
- ` ${brand("[t]")} Browse templates`,
207
- "",
208
- ` ${dim("Or run with a project directory:")}`,
209
- ` ${muted("deno task start --project ./my-project")}`,
210
- "",
211
- ].join("\n");
197
+ return `\n ${dim("No projects.")} ${brand("n")} ${dim("to create")}\n`;
212
198
  }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Startup View
3
+ *
4
+ * Shows loading progress with consistent box sizing.
5
+ * Displays avatar, title, and step checklist.
6
+ */
7
+
8
+ import { box } from "../../ui/box.js";
9
+ import { brand, dim, shimmer } from "../../ui/colors.js";
10
+
11
+ // Dim orange for completed steps - matches the trailing dots in spinning animation
12
+ const dimOrange = (text: string) => `\x1b[38;2;180;100;65m${text}\x1b[0m`;
13
+ import { getTerminalWidth } from "../../ui/layout.js";
14
+ import { getAgentFaceWithText, getSpinningAgentFace } from "../../ui/dot-matrix.js";
15
+
16
+ export interface StartupStep {
17
+ label: string;
18
+ status: "pending" | "active" | "done";
19
+ }
20
+
21
+ export interface StartupState {
22
+ steps: StartupStep[];
23
+ serverUrl?: string;
24
+ mcpUrl?: string;
25
+ ready: boolean;
26
+ /** Animation frame counter for shimmer effect */
27
+ frame: number;
28
+ }
29
+
30
+ /**
31
+ * Render the startup view inside a consistent-sized box
32
+ */
33
+ export function renderStartup(state: StartupState): string {
34
+ const termWidth = Math.min(getTerminalWidth() - 4, 80);
35
+ const textLines: string[] = [];
36
+
37
+ if (state.ready) {
38
+ // Running state - always reserve space for both URL lines to prevent jumps
39
+ textLines.push("");
40
+ textLines.push(`${brand("Veryfront Code")} ${dim("is now running")}`);
41
+ textLines.push("");
42
+ textLines.push(state.serverUrl ? `${dim("Url")} ${brand(state.serverUrl)}` : "");
43
+ textLines.push(state.mcpUrl ? `${dim("Mcp")} ${brand(state.mcpUrl)}` : "");
44
+ } else {
45
+ // Loading state - match ready state layout
46
+ textLines.push("");
47
+ textLines.push(`${brand("Veryfront Code")} ${dim("starting...")}`);
48
+ textLines.push("");
49
+
50
+ for (const step of state.steps) {
51
+ if (step.status === "done") {
52
+ // Completed: dim orange (fades into background, coherent with avatar)
53
+ textLines.push(`${dimOrange("●")} ${dimOrange(step.label)}`);
54
+ } else if (step.status === "active") {
55
+ // Active: bright orange dot with shimmer text
56
+ textLines.push(`${brand("●")} ${shimmer(step.label, state.frame)}`);
57
+ } else {
58
+ // Pending: gray empty circle
59
+ textLines.push(`${dim("○")} ${dim(step.label)}`);
60
+ }
61
+ }
62
+ }
63
+
64
+ // Pad to 7 text lines (matching avatar height) for consistent title position
65
+ while (textLines.length < 7) {
66
+ textLines.push("");
67
+ }
68
+
69
+ // Use spinning avatar during loading, static when ready or all steps done
70
+ const allStepsDone = state.steps.every((s) => s.status === "done");
71
+ const content = state.ready || allStepsDone
72
+ ? getAgentFaceWithText(textLines, {
73
+ litColor: "\x1b[38;2;252;143;93m", // Veryfront brand orange
74
+ })
75
+ : getSpinningAgentFace(textLines, state.frame, {
76
+ litColor: "\x1b[38;2;252;143;93m", // Veryfront brand orange
77
+ });
78
+
79
+ return box(content, {
80
+ style: "rounded",
81
+ width: termWidth,
82
+ paddingX: 2,
83
+ paddingY: 1,
84
+ borderColor: "\x1b[2m", // Dim to match footer
85
+ });
86
+ }
87
+
88
+ /**
89
+ * Create initial startup state with steps
90
+ */
91
+ export function createStartupState(stepLabels: string[]): StartupState {
92
+ return {
93
+ steps: stepLabels.map((label) => ({ label, status: "pending" })),
94
+ ready: false,
95
+ frame: 0,
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Increment animation frame for shimmer effect
101
+ */
102
+ export function incrementFrame(state: StartupState): StartupState {
103
+ return { ...state, frame: state.frame + 1 };
104
+ }
105
+
106
+ /**
107
+ * Set a step to active
108
+ */
109
+ export function setStepActive(state: StartupState, index: number): StartupState {
110
+ const steps = state.steps.map((step, i) => ({
111
+ ...step,
112
+ status: i < index ? "done" : i === index ? "active" : "pending",
113
+ })) as StartupStep[];
114
+
115
+ return { ...state, steps };
116
+ }
117
+
118
+ /**
119
+ * Mark all steps done and set ready
120
+ */
121
+ export function setStartupReady(
122
+ state: StartupState,
123
+ serverUrl: string,
124
+ mcpUrl?: string,
125
+ ): StartupState {
126
+ const steps = state.steps.map((step) => ({
127
+ ...step,
128
+ status: "done" as const,
129
+ }));
130
+
131
+ return { ...state, steps, serverUrl, mcpUrl, ready: true };
132
+ }
@@ -18,7 +18,7 @@ export async function createPackageJson(
18
18
  dependencies: {
19
19
  react: "^19.0.0",
20
20
  "react-dom": "^19.0.0",
21
- veryfront: "^0.0.63",
21
+ veryfront: "^0.0.88",
22
22
  zod: "^3.24.0",
23
23
  },
24
24
  };
@@ -95,6 +95,7 @@ export function parseCliArgs(args: string[]): ParsedArgs {
95
95
  t: "template",
96
96
  j: "json",
97
97
  w: "with",
98
+ m: "mode",
98
99
  },
99
100
  default: { port: DEFAULT_PORT },
100
101
  }) as ParsedArgs;
@@ -204,51 +204,68 @@ export async function routeCommand(args: ParsedArgs): Promise<void> {
204
204
 
205
205
  case "preview":
206
206
  case "serve": {
207
- showLogo();
208
-
209
- const { runtime } = await import("../../platform/adapters/detect.js");
210
- const adapter = await runtime.get();
211
- const { startUniversalServer } = await import("../../server/production-server.js");
212
-
213
- const projectDir = cwd();
207
+ const mode = (args.mode || args.m || "renderer") as "combined" | "proxy" | "renderer";
214
208
  const port = args.port ?? DEFAULT_DEV_SERVER_PORT;
215
209
  const bindAddress = String(args.hostname || args.host || "0.0.0.0");
216
- const debug = Boolean(args.debug);
217
- const shutdownController = new AbortController();
218
-
219
- const server = await startUniversalServer({
220
- projectDir,
221
- port,
222
- bindAddress,
223
- debug,
224
- adapter,
225
- signal: shutdownController.signal,
226
- });
227
- await server.ready;
228
210
 
229
- let shuttingDown = false;
230
- const shutdown = async (signal: "SIGINT" | "SIGTERM"): Promise<void> => {
231
- if (shuttingDown) return;
232
- shuttingDown = true;
233
-
234
- cliLogger.info(`Received ${signal}, shutting down production server...`);
235
- try {
236
- shutdownController.abort();
237
- await server.stop();
238
- } catch (error) {
239
- cliLogger.warn("Error while shutting down production server:", error);
240
- } finally {
241
- exitProcess(0);
242
- }
243
- };
211
+ if (mode === "proxy") {
212
+ // Proxy-only mode: run OAuth token proxy
213
+ showLogo();
214
+ cliLogger.info(`Starting proxy server on ${bindAddress}:${port}`);
215
+
216
+ // Set environment variables for proxy
217
+ const { setEnv } = await import("../../platform/compat/process.js");
218
+ setEnv("PORT", String(port));
219
+ setEnv("HOST", bindAddress);
220
+
221
+ // Import and run proxy main
222
+ await import("../../../proxy/main.js");
223
+ } else if (mode === "renderer" || mode === "combined") {
224
+ // Renderer mode: run SSR production server
225
+ showLogo();
226
+
227
+ const { runtime } = await import("../../platform/adapters/detect.js");
228
+ const adapter = await runtime.get();
229
+ const { startUniversalServer } = await import("../../server/production-server.js");
230
+
231
+ const projectDir = cwd();
232
+ const debug = Boolean(args.debug);
233
+ const shutdownController = new AbortController();
234
+
235
+ const server = await startUniversalServer({
236
+ projectDir,
237
+ port,
238
+ bindAddress,
239
+ debug,
240
+ adapter,
241
+ signal: shutdownController.signal,
242
+ });
243
+ await server.ready;
244
+
245
+ let shuttingDown = false;
246
+ const shutdown = async (signal: "SIGINT" | "SIGTERM"): Promise<void> => {
247
+ if (shuttingDown) return;
248
+ shuttingDown = true;
249
+
250
+ cliLogger.info(`Received ${signal}, shutting down production server...`);
251
+ try {
252
+ shutdownController.abort();
253
+ await server.stop();
254
+ } catch (error) {
255
+ cliLogger.warn("Error while shutting down production server:", error);
256
+ } finally {
257
+ exitProcess(0);
258
+ }
259
+ };
244
260
 
245
- registerTerminationSignals((signal) => {
246
- void shutdown(signal);
247
- });
261
+ registerTerminationSignals((signal) => {
262
+ void shutdown(signal);
263
+ });
248
264
 
249
- await new Promise(() => {
250
- /* never resolve */
251
- });
265
+ await new Promise(() => {
266
+ /* never resolve */
267
+ });
268
+ }
252
269
  break;
253
270
  }
254
271
 
@@ -18,6 +18,8 @@ export interface GenerateCommandArgs {
18
18
  _: (string | number)[];
19
19
  }
20
20
 
21
+ export type ServerMode = "combined" | "proxy" | "renderer";
22
+
21
23
  export interface ParsedArgs {
22
24
  _: (string | number)[];
23
25
  port?: number;
@@ -41,5 +43,8 @@ export interface ParsedArgs {
41
43
  j?: boolean;
42
44
  with?: string[];
43
45
  w?: string[];
46
+ /** Server mode: combined (default), proxy, or renderer */
47
+ mode?: ServerMode;
48
+ m?: ServerMode;
44
49
  [key: string]: unknown;
45
50
  }
@@ -157,3 +157,40 @@ export function animatedMatrix(frame: number): string {
157
157
  const state = MATRIX_STATES[frame % MATRIX_STATES.length] ?? ["●", "○", "○"];
158
158
  return state.map((dot) => (dot === "●" ? brand(dot) : muted(dot))).join("");
159
159
  }
160
+
161
+ /**
162
+ * Apply shimmer effect to text - creates a wave of brightness moving across
163
+ * @param text The text to shimmer
164
+ * @param frame Current animation frame (increments over time)
165
+ * @param waveWidth Width of the bright wave (default: 3 characters)
166
+ * @returns Text with shimmer effect applied
167
+ */
168
+ export function shimmer(text: string, frame: number, waveWidth = 3): string {
169
+ // Brand orange gradient: bright → normal → dim
170
+ const bright = (char: string) => applyColor(char, 255, 180, 140, false); // Brighter orange
171
+ const normal = (char: string) => applyColor(char, 252, 143, 93, false); // Brand orange
172
+ const dimmed = (char: string) => applyColor(char, 180, 100, 65, false); // Dimmer orange
173
+
174
+ const len = text.length;
175
+ const wavePos = frame % (len + waveWidth * 2);
176
+
177
+ let result = "";
178
+ for (let i = 0; i < len; i++) {
179
+ const char = text[i]!;
180
+ const distFromWave = i - (wavePos - waveWidth);
181
+
182
+ if (distFromWave >= 0 && distFromWave < waveWidth) {
183
+ // In the bright wave
184
+ const intensity = 1 - Math.abs(distFromWave - waveWidth / 2) / (waveWidth / 2);
185
+ if (intensity > 0.6) {
186
+ result += bright(char);
187
+ } else {
188
+ result += normal(char);
189
+ }
190
+ } else {
191
+ result += dimmed(char);
192
+ }
193
+ }
194
+
195
+ return result;
196
+ }