veryfront 0.1.48 → 0.1.49

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 (524) hide show
  1. package/esm/cli/app/components/inline-input.d.ts +1 -4
  2. package/esm/cli/app/components/inline-input.d.ts.map +1 -1
  3. package/esm/cli/app/components/inline-input.js +1 -1
  4. package/esm/cli/app/components/list-select.d.ts +0 -8
  5. package/esm/cli/app/components/list-select.d.ts.map +1 -1
  6. package/esm/cli/app/components/list-select.js +0 -13
  7. package/esm/cli/app/operations/project-creation.d.ts +2 -14
  8. package/esm/cli/app/operations/project-creation.d.ts.map +1 -1
  9. package/esm/cli/app/operations/project-creation.js +3 -68
  10. package/esm/cli/app/shell.js +1 -1
  11. package/esm/cli/app/utils.d.ts +1 -2
  12. package/esm/cli/app/utils.d.ts.map +1 -1
  13. package/esm/cli/app/utils.js +1 -17
  14. package/esm/cli/app/views/dashboard.d.ts +0 -4
  15. package/esm/cli/app/views/dashboard.d.ts.map +1 -1
  16. package/esm/cli/app/views/dashboard.js +0 -15
  17. package/esm/cli/app/views/startup.d.ts +0 -4
  18. package/esm/cli/app/views/startup.d.ts.map +1 -1
  19. package/esm/cli/app/views/startup.js +0 -7
  20. package/esm/cli/auth/login.d.ts.map +1 -1
  21. package/esm/cli/auth/login.js +1 -2
  22. package/esm/cli/auth/token-store.js +1 -1
  23. package/esm/cli/auth/utils.d.ts +2 -1
  24. package/esm/cli/auth/utils.d.ts.map +1 -1
  25. package/esm/cli/commands/generate/integration-generator.js +1 -1
  26. package/esm/cli/commands/install/types.d.ts +2 -2
  27. package/esm/cli/help/formatters.d.ts +1 -1
  28. package/esm/cli/help/formatters.d.ts.map +1 -1
  29. package/esm/cli/help/formatters.js +8 -4
  30. package/esm/cli/help/main-help.d.ts.map +1 -1
  31. package/esm/cli/help/main-help.js +2 -2
  32. package/esm/cli/mcp/server.d.ts +0 -1
  33. package/esm/cli/mcp/server.d.ts.map +1 -1
  34. package/esm/cli/mcp/server.js +2 -5
  35. package/esm/cli/mcp/tools/dev-tools.d.ts +1 -1
  36. package/esm/cli/mcp/tools/dev-tools.d.ts.map +1 -1
  37. package/esm/cli/mcp/tools/dev-tools.js +1 -2
  38. package/esm/cli/mcp/tools/scaffold-tools.d.ts +2 -2
  39. package/esm/cli/mcp/tools.d.ts +1 -2
  40. package/esm/cli/mcp/tools.d.ts.map +1 -1
  41. package/esm/cli/mcp/tools.js +1 -2
  42. package/esm/cli/shared/reserve-slug.d.ts.map +1 -1
  43. package/esm/cli/shared/reserve-slug.js +1 -3
  44. package/esm/cli/sync/ignore.d.ts +1 -1
  45. package/esm/cli/sync/ignore.d.ts.map +1 -1
  46. package/esm/cli/sync/ignore.js +22 -18
  47. package/esm/cli/ui/colors.d.ts +0 -1
  48. package/esm/cli/ui/colors.d.ts.map +1 -1
  49. package/esm/cli/ui/colors.js +0 -10
  50. package/esm/cli/ui/dot-matrix.d.ts.map +1 -1
  51. package/esm/cli/ui/dot-matrix.js +2 -5
  52. package/esm/cli/ui/tui.js +2 -3
  53. package/esm/cli/utils/index.js +1 -2
  54. package/esm/cli/utils/package-manager.d.ts.map +1 -1
  55. package/esm/cli/utils/package-manager.js +3 -4
  56. package/esm/deno.d.ts +3 -0
  57. package/esm/deno.js +22 -19
  58. package/esm/src/agent/chat-handler.d.ts.map +1 -1
  59. package/esm/src/agent/chat-handler.js +8 -23
  60. package/esm/src/agent/factory.d.ts +0 -8
  61. package/esm/src/agent/factory.d.ts.map +1 -1
  62. package/esm/src/agent/factory.js +50 -1
  63. package/esm/src/agent/index.d.ts +16 -1
  64. package/esm/src/agent/index.d.ts.map +1 -1
  65. package/esm/src/agent/index.js +16 -1
  66. package/esm/src/agent/memory/memory.d.ts +2 -2
  67. package/esm/src/agent/memory/memory.d.ts.map +1 -1
  68. package/esm/src/agent/memory/memory.js +0 -1
  69. package/esm/src/agent/react/use-chat/types.d.ts +2 -0
  70. package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
  71. package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
  72. package/esm/src/agent/react/use-chat/use-chat.js +15 -9
  73. package/esm/src/agent/runtime/index.d.ts +18 -0
  74. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  75. package/esm/src/agent/runtime/index.js +167 -36
  76. package/esm/src/agent/runtime/tool-helpers.d.ts +6 -1
  77. package/esm/src/agent/runtime/tool-helpers.d.ts.map +1 -1
  78. package/esm/src/agent/runtime/tool-helpers.js +10 -1
  79. package/esm/src/agent/schemas/agent.schema.d.ts +4 -4
  80. package/esm/src/agent/types.d.ts +10 -0
  81. package/esm/src/agent/types.d.ts.map +1 -1
  82. package/esm/src/ai/registry-manager.d.ts.map +1 -1
  83. package/esm/src/ai/registry-manager.js +2 -1
  84. package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts +0 -2
  85. package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts.map +1 -1
  86. package/esm/src/build/bundler/code-splitter/manifest-builder.js +1 -1
  87. package/esm/src/build/compiler/mdx-compiler/validator.d.ts.map +1 -1
  88. package/esm/src/build/compiler/mdx-compiler/validator.js +2 -3
  89. package/esm/src/build/compiler/mdx-to-js.d.ts +0 -2
  90. package/esm/src/build/compiler/mdx-to-js.d.ts.map +1 -1
  91. package/esm/src/build/compiler/mdx-to-js.js +0 -81
  92. package/esm/src/build/index.d.ts +0 -6
  93. package/esm/src/build/index.d.ts.map +1 -1
  94. package/esm/src/build/index.js +0 -1
  95. package/esm/src/build/production-build/build/route-collector.d.ts.map +1 -1
  96. package/esm/src/build/production-build/build/route-collector.js +2 -3
  97. package/esm/src/build/production-build/templates.d.ts +5 -9
  98. package/esm/src/build/production-build/templates.d.ts.map +1 -1
  99. package/esm/src/build/production-build/templates.js +6 -18
  100. package/esm/src/build/vendor-cache.d.ts.map +1 -1
  101. package/esm/src/build/vendor-cache.js +0 -5
  102. package/esm/src/cache/tokenizing-gateway.d.ts +0 -2
  103. package/esm/src/cache/tokenizing-gateway.d.ts.map +1 -1
  104. package/esm/src/cache/tokenizing-gateway.js +1 -3
  105. package/esm/src/chat/index.d.ts +2 -2
  106. package/esm/src/chat/index.d.ts.map +1 -1
  107. package/esm/src/chat/index.js +1 -1
  108. package/esm/src/config/define-config.d.ts.map +1 -1
  109. package/esm/src/config/define-config.js +28 -25
  110. package/esm/src/config/loader.d.ts.map +1 -1
  111. package/esm/src/config/loader.js +10 -7
  112. package/esm/src/config/schemas/config.schema.d.ts +58 -12
  113. package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
  114. package/esm/src/config/schemas/config.schema.js +12 -0
  115. package/esm/src/data/data-fetcher.d.ts +1 -2
  116. package/esm/src/data/data-fetcher.d.ts.map +1 -1
  117. package/esm/src/data/data-fetcher.js +14 -15
  118. package/esm/src/data/server-data-fetcher.d.ts +0 -3
  119. package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
  120. package/esm/src/data/server-data-fetcher.js +1 -8
  121. package/esm/src/data/static-data-fetcher.d.ts +1 -3
  122. package/esm/src/data/static-data-fetcher.d.ts.map +1 -1
  123. package/esm/src/data/static-data-fetcher.js +1 -3
  124. package/esm/src/discovery/discovery-engine.d.ts.map +1 -1
  125. package/esm/src/discovery/discovery-engine.js +19 -1
  126. package/esm/src/discovery/discovery-utils.d.ts +0 -4
  127. package/esm/src/discovery/discovery-utils.d.ts.map +1 -1
  128. package/esm/src/discovery/discovery-utils.js +0 -6
  129. package/esm/src/discovery/file-discovery.d.ts +3 -1
  130. package/esm/src/discovery/file-discovery.d.ts.map +1 -1
  131. package/esm/src/discovery/file-discovery.js +3 -8
  132. package/esm/src/discovery/handlers/index.d.ts +1 -0
  133. package/esm/src/discovery/handlers/index.d.ts.map +1 -1
  134. package/esm/src/discovery/handlers/index.js +1 -0
  135. package/esm/src/discovery/handlers/skill-handler.d.ts +26 -0
  136. package/esm/src/discovery/handlers/skill-handler.d.ts.map +1 -0
  137. package/esm/src/discovery/handlers/skill-handler.js +87 -0
  138. package/esm/src/discovery/handlers/task-handler.d.ts.map +1 -1
  139. package/esm/src/discovery/handlers/task-handler.js +1 -5
  140. package/esm/src/discovery/transpiler.d.ts.map +1 -1
  141. package/esm/src/discovery/transpiler.js +7 -4
  142. package/esm/src/discovery/types.d.ts +3 -0
  143. package/esm/src/discovery/types.d.ts.map +1 -1
  144. package/esm/src/embedding/resolve.d.ts.map +1 -1
  145. package/esm/src/embedding/resolve.js +1 -3
  146. package/esm/src/embedding/upload-handler.d.ts.map +1 -1
  147. package/esm/src/embedding/upload-handler.js +4 -3
  148. package/esm/src/embedding/upload-store.js +4 -4
  149. package/esm/src/errors/error-registry.d.ts +2 -1
  150. package/esm/src/errors/error-registry.d.ts.map +1 -1
  151. package/esm/src/errors/http-error.d.ts +1 -2
  152. package/esm/src/errors/http-error.d.ts.map +1 -1
  153. package/esm/src/errors/http-error.js +2 -2
  154. package/esm/src/errors/middleware/cli-error-boundary.d.ts.map +1 -1
  155. package/esm/src/errors/middleware/cli-error-boundary.js +13 -2
  156. package/esm/src/errors/middleware/wrap-unknown.d.ts +0 -7
  157. package/esm/src/errors/middleware/wrap-unknown.d.ts.map +1 -1
  158. package/esm/src/errors/middleware/wrap-unknown.js +0 -9
  159. package/esm/src/errors/veryfront-error.d.ts +0 -3
  160. package/esm/src/errors/veryfront-error.d.ts.map +1 -1
  161. package/esm/src/errors/veryfront-error.js +0 -5
  162. package/esm/src/html/schemas/html.schema.d.ts +2 -2
  163. package/esm/src/html/styles-builder/css-hash-cache.d.ts.map +1 -1
  164. package/esm/src/html/styles-builder/css-hash-cache.js +1 -2
  165. package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
  166. package/esm/src/html/styles-builder/plugin-loader.js +50 -21
  167. package/esm/src/html/styles-builder/tailwind-compiler-cache.d.ts.map +1 -1
  168. package/esm/src/html/styles-builder/tailwind-compiler-cache.js +12 -4
  169. package/esm/src/html/utils.d.ts +0 -7
  170. package/esm/src/html/utils.d.ts.map +1 -1
  171. package/esm/src/html/utils.js +0 -25
  172. package/esm/src/modules/component-registry/registry.d.ts +0 -3
  173. package/esm/src/modules/component-registry/registry.d.ts.map +1 -1
  174. package/esm/src/modules/component-registry/registry.js +0 -3
  175. package/esm/src/oauth/handlers/callback-handler.d.ts +2 -0
  176. package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
  177. package/esm/src/oauth/handlers/callback-handler.js +10 -4
  178. package/esm/src/oauth/providers/common.d.ts.map +1 -1
  179. package/esm/src/oauth/providers/common.js +0 -23
  180. package/esm/src/observability/auto-instrument/react-instrumentation.js +2 -1
  181. package/esm/src/observability/instruments/instruments-factory.d.ts +1 -1
  182. package/esm/src/observability/instruments/instruments-factory.d.ts.map +1 -1
  183. package/esm/src/observability/instruments/instruments-factory.js +5 -4
  184. package/esm/src/observability/metrics/config.js +5 -4
  185. package/esm/src/observability/metrics/manager.js +1 -1
  186. package/esm/src/observability/tracing/span-operations.d.ts.map +1 -1
  187. package/esm/src/observability/tracing/span-operations.js +14 -8
  188. package/esm/src/platform/compat/console/node.d.ts +0 -1
  189. package/esm/src/platform/compat/console/node.d.ts.map +1 -1
  190. package/esm/src/platform/compat/console/node.js +4 -11
  191. package/esm/src/platform/compat/fs.d.ts.map +1 -1
  192. package/esm/src/platform/compat/fs.js +4 -2
  193. package/esm/src/platform/compat/opaque-deps.d.ts +4 -2
  194. package/esm/src/platform/compat/opaque-deps.d.ts.map +1 -1
  195. package/esm/src/platform/compat/opaque-deps.js +1 -1
  196. package/esm/src/platform/compat/path/basic-operations.d.ts.map +1 -1
  197. package/esm/src/platform/compat/path/basic-operations.js +8 -7
  198. package/esm/src/platform/compat/path/resolution.d.ts.map +1 -1
  199. package/esm/src/platform/compat/path/resolution.js +15 -10
  200. package/esm/src/platform/compat/path/url-conversion.d.ts.map +1 -1
  201. package/esm/src/platform/compat/path/url-conversion.js +3 -2
  202. package/esm/src/platform/compat/process.d.ts +2 -14
  203. package/esm/src/platform/compat/process.d.ts.map +1 -1
  204. package/esm/src/platform/compat/process.js +92 -70
  205. package/esm/src/provider/index.d.ts +1 -1
  206. package/esm/src/provider/index.d.ts.map +1 -1
  207. package/esm/src/provider/index.js +1 -1
  208. package/esm/src/provider/local/ai-sdk-adapter.d.ts.map +1 -1
  209. package/esm/src/provider/local/ai-sdk-adapter.js +18 -18
  210. package/esm/src/provider/local/env.d.ts.map +1 -1
  211. package/esm/src/provider/local/env.js +2 -1
  212. package/esm/src/provider/model-registry.d.ts +10 -0
  213. package/esm/src/provider/model-registry.d.ts.map +1 -1
  214. package/esm/src/provider/model-registry.js +43 -0
  215. package/esm/src/proxy/retry.d.ts +3 -3
  216. package/esm/src/proxy/retry.d.ts.map +1 -1
  217. package/esm/src/proxy/retry.js +0 -7
  218. package/esm/src/proxy/tracing.d.ts +1 -5
  219. package/esm/src/proxy/tracing.d.ts.map +1 -1
  220. package/esm/src/proxy/tracing.js +1 -7
  221. package/esm/src/react/components/ai/chat/components/code-block.js +1 -1
  222. package/esm/src/react/components/ai/chat/components/skill-badge.d.ts +12 -0
  223. package/esm/src/react/components/ai/chat/components/skill-badge.d.ts.map +1 -0
  224. package/esm/src/react/components/ai/chat/components/skill-badge.js +34 -0
  225. package/esm/src/react/components/ai/chat/components/step-indicator.js +4 -4
  226. package/esm/src/react/components/ai/chat/composition/chat-message-list.d.ts.map +1 -1
  227. package/esm/src/react/components/ai/chat/composition/chat-message-list.js +8 -2
  228. package/esm/src/react/components/ai/chat/composition/message.d.ts.map +1 -1
  229. package/esm/src/react/components/ai/chat/composition/message.js +8 -2
  230. package/esm/src/react/components/ai/chat/index.d.ts +4 -1
  231. package/esm/src/react/components/ai/chat/index.d.ts.map +1 -1
  232. package/esm/src/react/components/ai/chat/index.js +4 -3
  233. package/esm/src/react/components/ai/chat/utils/message-parts.d.ts +2 -0
  234. package/esm/src/react/components/ai/chat/utils/message-parts.d.ts.map +1 -1
  235. package/esm/src/react/components/ai/chat/utils/message-parts.js +9 -0
  236. package/esm/src/react/components/ai/chat-with-sidebar.d.ts +1 -0
  237. package/esm/src/react/components/ai/chat-with-sidebar.d.ts.map +1 -1
  238. package/esm/src/react/components/ai/chat-with-sidebar.js +1 -0
  239. package/esm/src/react/components/ai/chat.d.ts +1 -1
  240. package/esm/src/react/components/ai/chat.d.ts.map +1 -1
  241. package/esm/src/react/components/ai/chat.js +1 -1
  242. package/esm/src/rendering/cache/index.d.ts +1 -5
  243. package/esm/src/rendering/cache/index.d.ts.map +1 -1
  244. package/esm/src/rendering/cache/index.js +1 -5
  245. package/esm/src/rendering/orchestrator/pipeline.d.ts +11 -2
  246. package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
  247. package/esm/src/rendering/shared/context-aware-cache.d.ts.map +1 -1
  248. package/esm/src/rendering/shared/context-aware-cache.js +0 -4
  249. package/esm/src/repositories/schemas/index.d.ts +1 -1
  250. package/esm/src/repositories/schemas/index.d.ts.map +1 -1
  251. package/esm/src/repositories/schemas/index.js +1 -1
  252. package/esm/src/repositories/schemas/repository.schema.d.ts +0 -11
  253. package/esm/src/repositories/schemas/repository.schema.d.ts.map +1 -1
  254. package/esm/src/repositories/schemas/repository.schema.js +0 -13
  255. package/esm/src/repositories/types.d.ts +1 -1
  256. package/esm/src/repositories/types.d.ts.map +1 -1
  257. package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
  258. package/esm/src/routing/api/module-loader/loader.js +63 -7
  259. package/esm/src/routing/api/openapi/path-utils.d.ts +0 -19
  260. package/esm/src/routing/api/openapi/path-utils.d.ts.map +1 -1
  261. package/esm/src/routing/api/openapi/path-utils.js +0 -34
  262. package/esm/src/routing/api/openapi/spec-generator.d.ts.map +1 -1
  263. package/esm/src/routing/api/openapi/spec-generator.js +1 -19
  264. package/esm/src/routing/api/openapi/types.d.ts +1 -0
  265. package/esm/src/routing/api/openapi/types.d.ts.map +1 -1
  266. package/esm/src/routing/api/openapi/types.js +18 -0
  267. package/esm/src/sandbox/sandbox.d.ts +1 -0
  268. package/esm/src/sandbox/sandbox.d.ts.map +1 -1
  269. package/esm/src/sandbox/sandbox.js +7 -8
  270. package/esm/src/security/http/cors/constants.d.ts +0 -2
  271. package/esm/src/security/http/cors/constants.d.ts.map +1 -1
  272. package/esm/src/security/http/cors/constants.js +0 -2
  273. package/esm/src/security/http/response/index.d.ts +3 -4
  274. package/esm/src/security/http/response/index.d.ts.map +1 -1
  275. package/esm/src/security/http/response/index.js +2 -3
  276. package/esm/src/server/context/enriched-context.d.ts +0 -8
  277. package/esm/src/server/context/enriched-context.d.ts.map +1 -1
  278. package/esm/src/server/context/enriched-context.js +1 -12
  279. package/esm/src/server/dev-server/server.d.ts.map +1 -1
  280. package/esm/src/server/dev-server/server.js +11 -4
  281. package/esm/src/server/dev-ui/manifest.d.ts +20 -20
  282. package/esm/src/server/dev-ui/manifest.js +20 -20
  283. package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
  284. package/esm/src/server/handlers/dev/framework-candidates.generated.js +426 -179
  285. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  286. package/esm/src/server/runtime-handler/index.js +14 -24
  287. package/esm/src/server/shared/renderer/memory/pressure.d.ts +0 -7
  288. package/esm/src/server/shared/renderer/memory/pressure.d.ts.map +1 -1
  289. package/esm/src/server/shared/renderer/memory/pressure.js +1 -13
  290. package/esm/src/server/utils/domain-lookup.d.ts +0 -4
  291. package/esm/src/server/utils/domain-lookup.d.ts.map +1 -1
  292. package/esm/src/server/utils/domain-lookup.js +0 -3
  293. package/esm/src/skill/allowed-tools.d.ts +54 -0
  294. package/esm/src/skill/allowed-tools.d.ts.map +1 -0
  295. package/esm/src/skill/allowed-tools.js +87 -0
  296. package/esm/src/skill/executor.d.ts +28 -0
  297. package/esm/src/skill/executor.d.ts.map +1 -0
  298. package/esm/src/skill/executor.js +187 -0
  299. package/esm/src/skill/index.d.ts +19 -0
  300. package/esm/src/skill/index.d.ts.map +1 -0
  301. package/esm/src/skill/index.js +24 -0
  302. package/esm/src/skill/parser.d.ts +30 -0
  303. package/esm/src/skill/parser.d.ts.map +1 -0
  304. package/esm/src/skill/parser.js +162 -0
  305. package/esm/src/skill/path-safety.d.ts +22 -0
  306. package/esm/src/skill/path-safety.d.ts.map +1 -0
  307. package/esm/src/skill/path-safety.js +156 -0
  308. package/esm/src/skill/prompt-augmentation.d.ts +19 -0
  309. package/esm/src/skill/prompt-augmentation.d.ts.map +1 -0
  310. package/esm/src/skill/prompt-augmentation.js +36 -0
  311. package/esm/src/skill/registry.d.ts +25 -0
  312. package/esm/src/skill/registry.d.ts.map +1 -0
  313. package/esm/src/skill/registry.js +42 -0
  314. package/esm/src/skill/tools.d.ts +27 -0
  315. package/esm/src/skill/tools.d.ts.map +1 -0
  316. package/esm/src/skill/tools.js +149 -0
  317. package/esm/src/skill/types.d.ts +85 -0
  318. package/esm/src/skill/types.d.ts.map +1 -0
  319. package/esm/src/skill/types.js +27 -0
  320. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts +1 -1
  321. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
  322. package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
  323. package/esm/src/studio/element-selector-injector.d.ts +0 -2
  324. package/esm/src/studio/element-selector-injector.d.ts.map +1 -1
  325. package/esm/src/task/runner.d.ts +6 -0
  326. package/esm/src/task/runner.d.ts.map +1 -1
  327. package/esm/src/task/runner.js +8 -8
  328. package/esm/src/tool/factory.js +31 -39
  329. package/esm/src/transforms/esm/http-cache-helpers.d.ts +0 -8
  330. package/esm/src/transforms/esm/http-cache-helpers.d.ts.map +1 -1
  331. package/esm/src/transforms/esm/http-cache-helpers.js +0 -20
  332. package/esm/src/transforms/esm/path-resolver.d.ts +0 -14
  333. package/esm/src/transforms/esm/path-resolver.d.ts.map +1 -1
  334. package/esm/src/transforms/esm/path-resolver.js +1 -92
  335. package/esm/src/transforms/esm/source-url-embed.d.ts +0 -14
  336. package/esm/src/transforms/esm/source-url-embed.d.ts.map +1 -1
  337. package/esm/src/transforms/esm/source-url-embed.js +0 -47
  338. package/esm/src/transforms/esm/transform-cache.d.ts.map +1 -1
  339. package/esm/src/transforms/esm/transform-cache.js +2 -6
  340. package/esm/src/transforms/mdx/index.d.ts +0 -1
  341. package/esm/src/transforms/mdx/index.d.ts.map +1 -1
  342. package/esm/src/transforms/mdx/index.js +0 -4
  343. package/esm/src/transforms/pipeline/context.d.ts +0 -1
  344. package/esm/src/transforms/pipeline/context.d.ts.map +1 -1
  345. package/esm/src/transforms/pipeline/context.js +0 -1
  346. package/esm/src/transforms/pipeline/index.d.ts +1 -2
  347. package/esm/src/transforms/pipeline/index.d.ts.map +1 -1
  348. package/esm/src/transforms/pipeline/index.js +0 -3
  349. package/esm/src/transforms/pipeline/stages/ssr-http-cache.d.ts.map +1 -1
  350. package/esm/src/transforms/pipeline/stages/ssr-http-cache.js +0 -1
  351. package/esm/src/types/entities/getEntityInfo.js +1 -1
  352. package/esm/src/types/index.d.ts +2 -13
  353. package/esm/src/types/index.d.ts.map +1 -1
  354. package/esm/src/types/server.d.ts +2 -1
  355. package/esm/src/types/server.d.ts.map +1 -1
  356. package/esm/src/utils/cache-file-ops.d.ts +1 -1
  357. package/esm/src/utils/cache-file-ops.d.ts.map +1 -1
  358. package/esm/src/utils/cache-file-ops.js +5 -6
  359. package/esm/src/utils/lru-wrapper.d.ts.map +1 -1
  360. package/esm/src/utils/lru-wrapper.js +2 -4
  361. package/esm/src/workflow/claude-code/event-publisher.d.ts +0 -4
  362. package/esm/src/workflow/claude-code/event-publisher.d.ts.map +1 -1
  363. package/esm/src/workflow/claude-code/event-publisher.js +2 -6
  364. package/esm/src/workflow/executor/workflow-executor.d.ts.map +1 -1
  365. package/esm/src/workflow/executor/workflow-executor.js +6 -1
  366. package/esm/src/workflow/react/use-workflow-list.d.ts.map +1 -1
  367. package/esm/src/workflow/react/use-workflow-list.js +2 -1
  368. package/esm/src/workflow/schemas/workflow.schema.d.ts +8 -8
  369. package/package.json +1 -2
  370. package/src/cli/app/components/inline-input.ts +0 -5
  371. package/src/cli/app/components/list-select.ts +0 -21
  372. package/src/cli/app/operations/project-creation.ts +4 -109
  373. package/src/cli/app/shell.ts +1 -1
  374. package/src/cli/app/utils.ts +0 -22
  375. package/src/cli/app/views/dashboard.ts +0 -17
  376. package/src/cli/app/views/startup.ts +0 -13
  377. package/src/cli/auth/login.ts +1 -2
  378. package/src/cli/auth/token-store.ts +1 -1
  379. package/src/cli/auth/utils.ts +2 -1
  380. package/src/cli/commands/generate/integration-generator.ts +1 -1
  381. package/src/cli/help/formatters.ts +11 -4
  382. package/src/cli/help/main-help.ts +2 -3
  383. package/src/cli/mcp/server.ts +2 -5
  384. package/src/cli/mcp/tools/dev-tools.ts +1 -2
  385. package/src/cli/mcp/tools.ts +8 -2
  386. package/src/cli/shared/reserve-slug.ts +1 -4
  387. package/src/cli/sync/ignore.ts +26 -21
  388. package/src/cli/ui/colors.ts +0 -12
  389. package/src/cli/ui/dot-matrix.ts +3 -6
  390. package/src/cli/ui/tui.ts +3 -3
  391. package/src/cli/utils/index.ts +1 -1
  392. package/src/cli/utils/package-manager.ts +3 -4
  393. package/src/deno.js +22 -19
  394. package/src/src/agent/chat-handler.ts +8 -23
  395. package/src/src/agent/factory.ts +58 -9
  396. package/src/src/agent/index.ts +16 -1
  397. package/src/src/agent/memory/memory.ts +0 -9
  398. package/src/src/agent/react/use-chat/types.ts +2 -0
  399. package/src/src/agent/react/use-chat/use-chat.ts +15 -9
  400. package/src/src/agent/runtime/index.ts +213 -35
  401. package/src/src/agent/runtime/tool-helpers.ts +9 -0
  402. package/src/src/agent/types.ts +10 -0
  403. package/src/src/ai/registry-manager.ts +2 -1
  404. package/src/src/build/bundler/code-splitter/manifest-builder.ts +1 -1
  405. package/src/src/build/compiler/mdx-compiler/validator.ts +3 -7
  406. package/src/src/build/compiler/mdx-to-js.ts +0 -101
  407. package/src/src/build/index.ts +0 -8
  408. package/src/src/build/production-build/build/route-collector.ts +2 -4
  409. package/src/src/build/production-build/templates.ts +9 -18
  410. package/src/src/build/vendor-cache.ts +0 -6
  411. package/src/src/cache/tokenizing-gateway.ts +1 -9
  412. package/src/src/chat/index.ts +3 -0
  413. package/src/src/config/define-config.ts +30 -29
  414. package/src/src/config/loader.ts +10 -9
  415. package/src/src/config/schemas/config.schema.ts +12 -0
  416. package/src/src/data/data-fetcher.ts +15 -21
  417. package/src/src/data/server-data-fetcher.ts +1 -8
  418. package/src/src/data/static-data-fetcher.ts +1 -6
  419. package/src/src/discovery/discovery-engine.ts +27 -0
  420. package/src/src/discovery/discovery-utils.ts +0 -7
  421. package/src/src/discovery/file-discovery.ts +3 -9
  422. package/src/src/discovery/handlers/index.ts +1 -0
  423. package/src/src/discovery/handlers/skill-handler.ts +123 -0
  424. package/src/src/discovery/handlers/task-handler.ts +1 -5
  425. package/src/src/discovery/transpiler.ts +7 -4
  426. package/src/src/discovery/types.ts +3 -0
  427. package/src/src/embedding/resolve.ts +1 -3
  428. package/src/src/embedding/upload-handler.ts +7 -3
  429. package/src/src/embedding/upload-store.ts +4 -4
  430. package/src/src/errors/error-registry.ts +2 -2
  431. package/src/src/errors/http-error.ts +7 -3
  432. package/src/src/errors/middleware/cli-error-boundary.ts +28 -2
  433. package/src/src/errors/middleware/wrap-unknown.ts +0 -10
  434. package/src/src/errors/veryfront-error.ts +0 -9
  435. package/src/src/html/styles-builder/css-hash-cache.ts +5 -2
  436. package/src/src/html/styles-builder/plugin-loader.ts +58 -21
  437. package/src/src/html/styles-builder/tailwind-compiler-cache.ts +11 -4
  438. package/src/src/html/utils.ts +0 -33
  439. package/src/src/modules/component-registry/registry.ts +0 -3
  440. package/src/src/modules/server/websocket-handler.ts +1 -1
  441. package/src/src/oauth/handlers/callback-handler.ts +17 -5
  442. package/src/src/oauth/providers/base.ts +3 -3
  443. package/src/src/oauth/providers/common.ts +0 -23
  444. package/src/src/observability/auto-instrument/react-instrumentation.ts +2 -2
  445. package/src/src/observability/instruments/instruments-factory.ts +6 -6
  446. package/src/src/observability/metrics/config.ts +5 -5
  447. package/src/src/observability/metrics/manager.ts +1 -1
  448. package/src/src/observability/tracing/span-operations.ts +14 -9
  449. package/src/src/platform/compat/console/node.ts +4 -14
  450. package/src/src/platform/compat/fs.ts +14 -3
  451. package/src/src/platform/compat/opaque-deps.ts +10 -5
  452. package/src/src/platform/compat/path/basic-operations.ts +9 -7
  453. package/src/src/platform/compat/path/resolution.ts +15 -8
  454. package/src/src/platform/compat/path/url-conversion.ts +10 -6
  455. package/src/src/platform/compat/process.ts +133 -76
  456. package/src/src/provider/index.ts +1 -0
  457. package/src/src/provider/local/ai-sdk-adapter.ts +40 -37
  458. package/src/src/provider/local/env.ts +4 -1
  459. package/src/src/provider/model-registry.ts +47 -0
  460. package/src/src/proxy/retry.ts +0 -9
  461. package/src/src/proxy/tracing.ts +1 -9
  462. package/src/src/react/components/ai/chat/components/code-block.tsx +1 -1
  463. package/src/src/react/components/ai/chat/components/skill-badge.tsx +51 -0
  464. package/src/src/react/components/ai/chat/components/step-indicator.tsx +4 -4
  465. package/src/src/react/components/ai/chat/composition/chat-message-list.tsx +9 -2
  466. package/src/src/react/components/ai/chat/composition/message.tsx +9 -2
  467. package/src/src/react/components/ai/chat/index.tsx +6 -1
  468. package/src/src/react/components/ai/chat/utils/message-parts.ts +11 -0
  469. package/src/src/react/components/ai/chat-with-sidebar.tsx +2 -0
  470. package/src/src/react/components/ai/chat.tsx +3 -0
  471. package/src/src/rendering/cache/index.ts +12 -5
  472. package/src/src/rendering/orchestrator/pipeline.ts +12 -2
  473. package/src/src/rendering/renderer.ts +1 -1
  474. package/src/src/rendering/shared/context-aware-cache.ts +0 -5
  475. package/src/src/repositories/schemas/index.ts +0 -2
  476. package/src/src/repositories/schemas/repository.schema.ts +0 -15
  477. package/src/src/repositories/types.ts +1 -6
  478. package/src/src/routing/api/module-loader/loader.ts +88 -3
  479. package/src/src/routing/api/openapi/path-utils.ts +0 -39
  480. package/src/src/routing/api/openapi/spec-generator.ts +1 -20
  481. package/src/src/routing/api/openapi/types.ts +20 -0
  482. package/src/src/sandbox/sandbox.ts +8 -8
  483. package/src/src/security/http/cors/constants.ts +0 -4
  484. package/src/src/security/http/response/index.ts +3 -9
  485. package/src/src/server/context/enriched-context.ts +1 -19
  486. package/src/src/server/dev-server/server.ts +11 -4
  487. package/src/src/server/dev-ui/manifest.js +20 -20
  488. package/src/src/server/handlers/dev/framework-candidates.generated.ts +426 -179
  489. package/src/src/server/runtime-handler/index.ts +17 -28
  490. package/src/src/server/shared/renderer/memory/pressure.ts +2 -15
  491. package/src/src/server/utils/domain-lookup.ts +0 -4
  492. package/src/src/skill/allowed-tools.ts +107 -0
  493. package/src/src/skill/executor.ts +215 -0
  494. package/src/src/skill/index.ts +60 -0
  495. package/src/src/skill/parser.ts +214 -0
  496. package/src/src/skill/path-safety.ts +203 -0
  497. package/src/src/skill/prompt-augmentation.ts +48 -0
  498. package/src/src/skill/registry.ts +51 -0
  499. package/src/src/skill/tools.ts +197 -0
  500. package/src/src/skill/types.ts +107 -0
  501. package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
  502. package/src/src/studio/element-selector-injector.ts +0 -2
  503. package/src/src/task/runner.ts +10 -8
  504. package/src/src/tool/factory.ts +54 -54
  505. package/src/src/transforms/esm/http-cache-helpers.ts +0 -20
  506. package/src/src/transforms/esm/path-resolver.ts +1 -140
  507. package/src/src/transforms/esm/source-url-embed.ts +0 -53
  508. package/src/src/transforms/esm/transform-cache.ts +3 -7
  509. package/src/src/transforms/mdx/index.ts +0 -5
  510. package/src/src/transforms/pipeline/context.ts +0 -2
  511. package/src/src/transforms/pipeline/index.ts +0 -4
  512. package/src/src/transforms/pipeline/stages/ssr-http-cache.ts +0 -1
  513. package/src/src/types/entities/getEntityInfo.ts +1 -1
  514. package/src/src/types/index.ts +1 -20
  515. package/src/src/types/server.ts +1 -1
  516. package/src/src/utils/cache-file-ops.ts +5 -5
  517. package/src/src/utils/lru-wrapper.ts +2 -8
  518. package/src/src/workflow/claude-code/event-publisher.ts +13 -4
  519. package/src/src/workflow/executor/workflow-executor.ts +7 -2
  520. package/src/src/workflow/react/use-workflow-list.ts +3 -2
  521. package/esm/src/transforms/mdx/parser.d.ts +0 -4
  522. package/esm/src/transforms/mdx/parser.d.ts.map +0 -1
  523. package/esm/src/transforms/mdx/parser.js +0 -49
  524. package/src/src/transforms/mdx/parser.ts +0 -65
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Skill Discovery Handler
3
+ *
4
+ * Discovers skills from SKILL.md files in project directories.
5
+ * This is a parallel discovery path — it does NOT implement DiscoveryHandler<T>
6
+ * (which expects TypeScript import()). Instead, it operates on markdown files.
7
+ */
8
+
9
+ import { exists, readDir, readTextFile } from "../../platform/compat/fs.js";
10
+ import { join } from "../../platform/compat/path/index.js";
11
+ import { agentLogger } from "../../utils/logger/logger.js";
12
+ import { ensureError } from "../../errors/veryfront-error.js";
13
+ import { parseSkillFrontmatter, validateSkillMetadata } from "../../skill/parser.js";
14
+ import { SKILL_MD_FILENAME } from "../../skill/types.js";
15
+ import type { Skill } from "../../skill/index.js";
16
+ import type { FileDiscoveryContext } from "../types.js";
17
+
18
+ const logger = agentLogger.component("skill-discovery");
19
+
20
+ export interface SkillDiscoveryError {
21
+ file: string;
22
+ error: Error;
23
+ }
24
+
25
+ export interface SkillDiscoveryResult {
26
+ skills: Map<string, Skill>;
27
+ errors: SkillDiscoveryError[];
28
+ }
29
+
30
+ /**
31
+ * Discover skills from a directory.
32
+ *
33
+ * Scans for subdirectories containing SKILL.md files and parses them
34
+ * into Skill objects. Uses fsAdapter when available (for VFS/cloud),
35
+ * falling back to compat layer functions.
36
+ */
37
+ export async function discoverSkills(
38
+ dir: string,
39
+ context: FileDiscoveryContext,
40
+ verbose?: boolean,
41
+ ): Promise<SkillDiscoveryResult> {
42
+ const skills = new Map<string, Skill>();
43
+ const errors: SkillDiscoveryError[] = [];
44
+ const { fsAdapter } = context;
45
+
46
+ // Check if directory exists
47
+ const dirExists = fsAdapter ? await fsAdapter.exists(dir) : await exists(dir);
48
+
49
+ if (!dirExists) {
50
+ if (verbose) {
51
+ logger.info(`Skills directory does not exist: ${dir}`);
52
+ }
53
+ return { skills, errors };
54
+ }
55
+
56
+ // Iterate subdirectories
57
+ const entries = fsAdapter ? fsAdapter.readDir(dir) : readDir(dir);
58
+
59
+ for await (const entry of entries) {
60
+ if (!entry.isDirectory) continue;
61
+
62
+ const skillDir = join(dir, entry.name);
63
+ const skillMdPath = join(skillDir, SKILL_MD_FILENAME);
64
+
65
+ try {
66
+ // Check if SKILL.md exists
67
+ const mdExists = fsAdapter ? await fsAdapter.exists(skillMdPath) : await exists(skillMdPath);
68
+
69
+ if (!mdExists) {
70
+ if (verbose) {
71
+ logger.info(`Skipping ${entry.name}: no ${SKILL_MD_FILENAME}`);
72
+ }
73
+ continue;
74
+ }
75
+
76
+ // Read SKILL.md content
77
+ const content = fsAdapter
78
+ ? await fsAdapter.readFile(skillMdPath)
79
+ : await readTextFile(skillMdPath);
80
+
81
+ // Parse frontmatter
82
+ const parsed = await parseSkillFrontmatter(content);
83
+
84
+ // Validate metadata (directory name as fallback for skill name)
85
+ const metadata = validateSkillMetadata(parsed.frontmatter, entry.name);
86
+
87
+ // Warn if metadata name differs from directory name, use directory name as ID
88
+ const skillId = entry.name;
89
+ if (metadata.name !== entry.name) {
90
+ logger.warn(
91
+ `Skill "${metadata.name}" in directory "${entry.name}" — using directory name as ID`,
92
+ );
93
+ }
94
+
95
+ // Check for duplicate IDs (first wins)
96
+ if (skills.has(skillId)) {
97
+ logger.warn(`Duplicate skill "${skillId}" — keeping first registration`);
98
+ continue;
99
+ }
100
+
101
+ const skill: Skill = {
102
+ id: skillId,
103
+ metadata,
104
+ rootPath: skillDir,
105
+ ...(fsAdapter && { fsAdapter }),
106
+ };
107
+
108
+ skills.set(skillId, skill);
109
+
110
+ if (verbose) {
111
+ logger.info(`Discovered skill: ${skillId}`);
112
+ }
113
+ } catch (error) {
114
+ errors.push({ file: skillMdPath, error: ensureError(error) });
115
+
116
+ if (verbose) {
117
+ logger.error(`Error loading skill from ${entry.name}:`, error);
118
+ }
119
+ }
120
+ }
121
+
122
+ return { skills, errors };
123
+ }
@@ -10,12 +10,8 @@ export const taskHandler: DiscoveryHandler<TaskDefinition> = {
10
10
  typeName: "task",
11
11
  validate: (item): item is TaskDefinition => isTaskDefinition(item),
12
12
  getId: (_task, file, dir) => {
13
- // Derive ID from file path relative to tasks dir
14
- let relative = file;
15
13
  const prefix = dir.endsWith("/") ? dir : `${dir}/`;
16
- if (relative.startsWith(prefix)) {
17
- relative = relative.slice(prefix.length);
18
- }
14
+ const relative = file.startsWith(prefix) ? file.slice(prefix.length) : file;
19
15
  return relative.replace(/\.(ts|tsx|js|jsx)$/, "");
20
16
  },
21
17
  register: (_id, task) => task,
@@ -16,6 +16,10 @@ import type { FileSystemAdapter } from "../platform/adapters/base.js";
16
16
  import type { FileDiscoveryContext } from "./types.js";
17
17
  import { rewriteDiscoveryImports, rewriteForDeno } from "./import-rewriter.js";
18
18
  import { wrapWithCurrentContext } from "../platform/adapters/fs/veryfront/multi-project-adapter.js";
19
+ // Static import ensures deno compile includes embedding in the binary.
20
+ // Other modules (agent, tool, etc.) are statically imported elsewhere;
21
+ // embedding is only referenced here.
22
+ import * as embeddingMod from "../embedding/index.js";
19
23
 
20
24
  const transpileCache = new Map<string, unknown>();
21
25
 
@@ -28,13 +32,12 @@ let veryfrontGlobalsInitialized = false;
28
32
  async function ensureVeryfrontGlobals(): Promise<void> {
29
33
  if (veryfrontGlobalsInitialized || !isDenoCompiled) return;
30
34
 
31
- const [agentMod, toolMod, platformMod, promptMod, resourceMod, embeddingMod] = await Promise.all([
35
+ const [agentMod, toolMod, platformMod, promptMod, resourceMod] = await Promise.all([
32
36
  import("../agent/index.js"),
33
37
  import("../tool/index.js"),
34
38
  import("../platform/index.js"),
35
39
  import("../prompt/index.js"),
36
40
  import("../resource/index.js"),
37
- import("../embedding/index.js"),
38
41
  ]);
39
42
 
40
43
  (dntShim.dntGlobalThis as Record<string, unknown>).__VERYFRONT_MODULES__ = {
@@ -204,9 +207,9 @@ export async function importModule(
204
207
  },
205
208
  });
206
209
 
207
- if (result.errors?.length) {
210
+ if (result.errors.length > 0) {
208
211
  throw new Error(
209
- `Failed to transpile ${filePath}: ${result.errors[0]?.text || "unknown error"}`,
212
+ `Failed to transpile ${filePath}: ${result.errors[0]?.text ?? "unknown error"}`,
210
213
  );
211
214
  }
212
215
 
@@ -9,6 +9,7 @@ import type { Agent } from "../agent/index.js";
9
9
  import type { Resource } from "../resource/index.js";
10
10
  import type { Prompt } from "../prompt/index.js";
11
11
  import type { Workflow } from "../workflow/index.js";
12
+ import type { Skill } from "../skill/index.js";
12
13
  import type { TaskDefinition } from "../task/types.js";
13
14
  import type { Platform } from "../platform/core-platform.js";
14
15
  import type { FileSystemAdapter } from "../platform/adapters/base.js";
@@ -33,6 +34,7 @@ export interface DiscoveryConfig {
33
34
  baseDir: string;
34
35
  toolDirs?: string[];
35
36
  agentDirs?: string[];
37
+ skillDirs?: string[];
36
38
  resourceDirs?: string[];
37
39
  promptDirs?: string[];
38
40
  workflowDirs?: string[];
@@ -47,6 +49,7 @@ export interface DiscoveryConfig {
47
49
  export interface DiscoveryResult {
48
50
  tools: Map<string, Tool>;
49
51
  agents: Map<string, Agent>;
52
+ skills: Map<string, Skill>;
50
53
  resources: Map<string, Resource>;
51
54
  prompts: Map<string, Prompt>;
52
55
  workflows: Map<string, Workflow>;
@@ -64,9 +64,7 @@ function autoInitializeFromEnv(): void {
64
64
  }
65
65
 
66
66
  if (!providers.has("local")) {
67
- providers.set("local", (id) => {
68
- return createLocalEmbeddingModel(id);
69
- });
67
+ providers.set("local", createLocalEmbeddingModel);
70
68
  }
71
69
  }
72
70
 
@@ -51,8 +51,12 @@ function inferType(file: dntShim.File): string | null {
51
51
  return EXT_TO_TYPE[ext ?? ""] ?? null;
52
52
  }
53
53
 
54
- function mimeForType(type: string): string {
55
- return Object.entries(MIME_TO_TYPE).find(([, v]) => v === type)?.[0] ?? "text/plain";
54
+ const TYPE_TO_MIME: Record<string, string> = Object.fromEntries(
55
+ Object.entries(MIME_TO_TYPE).map(([mime, type]) => [type, mime]),
56
+ );
57
+
58
+ function typeToMime(type: string): string {
59
+ return TYPE_TO_MIME[type] ?? "text/plain";
56
60
  }
57
61
 
58
62
  interface UploadHandlerConfig {
@@ -119,7 +123,7 @@ export function createUploadHandler(
119
123
  }
120
124
 
121
125
  const buffer = await file.arrayBuffer();
122
- const text = await loadUpload(buffer, mimeForType(fileType));
126
+ const text = await loadUpload(buffer, typeToMime(fileType));
123
127
  if (!text.trim()) {
124
128
  return dntShim.Response.json(
125
129
  { error: "No text could be extracted from file" },
@@ -170,10 +170,10 @@ export function uploadStore(config: UploadStoreConfig): UploadStore {
170
170
  createdAt: Date.now(),
171
171
  };
172
172
 
173
- const chunkRecords: StoredChunk[] = chunks.map((text, i) => ({
173
+ const chunkRecords: StoredChunk[] = chunks.map((chunkText, i) => ({
174
174
  id: dntShim.crypto.randomUUID(),
175
175
  uploadId,
176
- text,
176
+ text: chunkText,
177
177
  embedding: [], // filled lazily on first search
178
178
  index: i,
179
179
  }));
@@ -282,10 +282,10 @@ export function uploadStore(config: UploadStoreConfig): UploadStore {
282
282
  });
283
283
 
284
284
  data.chunks.push(
285
- ...chunks.map((text, i) => ({
285
+ ...chunks.map((chunkText, i) => ({
286
286
  id: dntShim.crypto.randomUUID(),
287
287
  uploadId,
288
- text,
288
+ text: chunkText,
289
289
  embedding: [] as number[],
290
290
  index: i,
291
291
  })),
@@ -1,4 +1,4 @@
1
- import { defineError } from "./types.js";
1
+ import { defineError, type ErrorCategory } from "./types.js";
2
2
 
3
3
  // =============================================================================
4
4
  // CONFIG - Configuration & environment errors
@@ -789,7 +789,7 @@ export function getErrorBySlug(slug: ErrorSlug) {
789
789
  /**
790
790
  * Get all errors in a category
791
791
  */
792
- export function getErrorsByCategory(category: string) {
792
+ export function getErrorsByCategory(category: ErrorCategory) {
793
793
  return Object.values(ERROR_REGISTRY).filter((error) => error.category === category);
794
794
  }
795
795
 
@@ -9,9 +9,13 @@
9
9
  import * as dntShim from "../../_dnt.shims.js";
10
10
 
11
11
 
12
- import { type ErrorCategory, type RFC9457Response, VeryfrontError } from "./types.js";
12
+ import {
13
+ type ErrorCategory,
14
+ type RegisteredError,
15
+ type RFC9457Response,
16
+ VeryfrontError,
17
+ } from "./types.js";
13
18
  import { getErrorMessage } from "./veryfront-error.js";
14
- import type { RegisteredError } from "./types.js";
15
19
 
16
20
  /**
17
21
  * Content-Type header for RFC 9457 responses
@@ -83,7 +87,7 @@ export function createProblemResponse(params: {
83
87
  * Check if an error is a VeryfrontError with slug-based identity
84
88
  */
85
89
  export function isVeryfrontError(error: unknown): error is VeryfrontError {
86
- return error instanceof VeryfrontError && typeof (error as VeryfrontError).slug === "string";
90
+ return error instanceof VeryfrontError;
87
91
  }
88
92
 
89
93
  /**
@@ -33,7 +33,20 @@ interface ColorFormatter {
33
33
  * Check if output is a TTY (supports colors)
34
34
  */
35
35
  function isTTY(): boolean {
36
- return dntShim.Deno.stdout.isTerminal?.() ?? false;
36
+ const deno = dntShim.dntGlobalThis as {
37
+ Deno?: {
38
+ stdout?: { isTerminal?: () => boolean };
39
+ };
40
+ process?: {
41
+ stdout?: { isTTY?: boolean };
42
+ };
43
+ };
44
+
45
+ if (typeof deno.Deno?.stdout?.isTerminal === "function") {
46
+ return deno.Deno.stdout.isTerminal();
47
+ }
48
+
49
+ return deno.process?.stdout?.isTTY ?? false;
37
50
  }
38
51
 
39
52
  /**
@@ -210,5 +223,18 @@ export function cliErrorBoundarySync(
210
223
  * Exit the process with a status code
211
224
  */
212
225
  function exit(code: number): never {
213
- dntShim.Deno.exit(code);
226
+ const runtime = dntShim.dntGlobalThis as {
227
+ Deno?: { exit?: (code: number) => never };
228
+ process?: { exit?: (code: number) => never };
229
+ };
230
+
231
+ if (typeof runtime.Deno?.exit === "function") {
232
+ runtime.Deno.exit(code);
233
+ }
234
+
235
+ if (typeof runtime.process?.exit === "function") {
236
+ runtime.process.exit(code);
237
+ }
238
+
239
+ throw new Error(`Failed to exit with code ${code}`);
214
240
  }
@@ -55,16 +55,6 @@ export function wrapUnknownError(
55
55
  });
56
56
  }
57
57
 
58
- /**
59
- * Check if an error is already a VeryfrontError
60
- *
61
- * @param error - Any error value
62
- * @returns True if the error is a VeryfrontError instance
63
- */
64
- export function isVeryfrontError(error: unknown): error is VeryfrontError {
65
- return error instanceof VeryfrontError;
66
- }
67
-
68
58
  /**
69
59
  * Wrap an error with additional context
70
60
  *
@@ -132,15 +132,6 @@ export function fromError(error: unknown): VeryfrontErrorData | null {
132
132
  return context as VeryfrontErrorData;
133
133
  }
134
134
 
135
- export function logError(
136
- error: VeryfrontErrorData,
137
- logger?: { error: (msg: string, ...args: unknown[]) => void },
138
- ): void {
139
- const log = logger ?? console;
140
- const context = "context" in error ? error.context : undefined;
141
- log.error(`[${error.type}] ${error.message}`, context ?? {});
142
- }
143
-
144
135
  /**
145
136
  * Extract error message from any error type
146
137
  */
@@ -17,8 +17,11 @@ import { serverLogger } from "../../utils/index.js";
17
17
  import { withSpan } from "../../observability/tracing/otlp-setup.js";
18
18
  import { SpanNames } from "../../observability/tracing/span-names.js";
19
19
  import { hashCSS } from "./candidate-extractor.js";
20
- import { buildCSSCacheEntry, parseCSSCacheEntry } from "./tailwind-compiler-utils.js";
21
- import { resolveStylesheet } from "./tailwind-compiler-utils.js";
20
+ import {
21
+ buildCSSCacheEntry,
22
+ parseCSSCacheEntry,
23
+ resolveStylesheet,
24
+ } from "./tailwind-compiler-utils.js";
22
25
 
23
26
  const logger = serverLogger.component("tailwind");
24
27
 
@@ -52,6 +52,49 @@ try {
52
52
  __esModule: true,
53
53
  };
54
54
 
55
+ function isRealDenoRuntime(): boolean {
56
+ return typeof dntShim.Deno !== "undefined" && typeof dntShim.Deno.version === "object";
57
+ }
58
+
59
+ function encodeToBase64(source: string): string {
60
+ const bufferCtor = (dntShim.dntGlobalThis as {
61
+ Buffer?: {
62
+ from: (input: string, encoding: string) => { toString: (encoding: string) => string };
63
+ };
64
+ }).Buffer;
65
+
66
+ if (bufferCtor?.from) {
67
+ return bufferCtor.from(source, "utf8").toString("base64");
68
+ }
69
+
70
+ const bytes = new TextEncoder().encode(source);
71
+ let binary = "";
72
+ for (const byte of bytes) binary += String.fromCharCode(byte);
73
+ return btoa(binary);
74
+ }
75
+
76
+ async function importBundledModule(code: string): Promise<unknown> {
77
+ if (!isRealDenoRuntime()) {
78
+ const dataUrl = `data:text/javascript;base64,${encodeToBase64(code)}`;
79
+ return await import(dataUrl);
80
+ }
81
+
82
+ const tempPath = await dntShim.Deno.makeTempFile({ prefix: "vf_tw_plugin_", suffix: ".mjs" });
83
+ await dntShim.Deno.writeTextFile(tempPath, code);
84
+ logger.debug("Wrote plugin to temp file", { path: tempPath });
85
+
86
+ try {
87
+ return await import(`file://${tempPath}`);
88
+ } finally {
89
+ await dntShim.Deno.remove(tempPath).catch((error) => {
90
+ logger.error("Failed to clean up temp plugin file", {
91
+ path: tempPath,
92
+ error: error instanceof Error ? error.message : String(error),
93
+ });
94
+ });
95
+ }
96
+ }
97
+
55
98
  /**
56
99
  * Dynamically load a module from esm.sh in a compiled Deno binary.
57
100
  *
@@ -111,21 +154,7 @@ export async function loadModuleFromEsmSh(packageName: string): Promise<unknown>
111
154
  "(globalThis.__localStorageShim||(globalThis.__localStorageShim={getItem:()=>null,setItem:()=>{},length:0}))",
112
155
  );
113
156
 
114
- // Step 5: Write to temp file and import
115
- const tempPath = `/tmp/tw_plugin_${dntShim.crypto.randomUUID()}.mjs`;
116
- await dntShim.Deno.writeTextFile(tempPath, code);
117
- logger.debug("Wrote plugin to temp file", { path: tempPath });
118
-
119
- try {
120
- return await import(`file://${tempPath}`);
121
- } finally {
122
- await dntShim.Deno.remove(tempPath).catch((error) => {
123
- logger.error("Failed to clean up temp plugin file", {
124
- path: tempPath,
125
- error: error instanceof Error ? error.message : String(error),
126
- });
127
- });
128
- }
157
+ return await importBundledModule(code);
129
158
  }
130
159
 
131
160
  export async function loadPlugin(
@@ -151,12 +180,20 @@ export async function loadPlugin(
151
180
  logger.debug("Loading plugin from node_modules", { id });
152
181
  try {
153
182
  mod = await import(id);
154
- } catch {
155
- const errorMsg = `Failed to load plugin "${id}": plugin not installed`;
156
- logger.warn("Plugin not installed", { id });
157
- pluginErrors.set(id, errorMsg);
158
- pluginCache.set(id, null);
159
- throw new Error(errorMsg);
183
+ } catch (importError) {
184
+ logger.debug("Plugin not found in node_modules, falling back to esm.sh", { id });
185
+ try {
186
+ mod = await loadModuleFromEsmSh(id);
187
+ } catch {
188
+ const errorMsg = `Failed to load plugin "${id}": plugin not installed`;
189
+ logger.warn("Plugin not installed", {
190
+ id,
191
+ error: importError instanceof Error ? importError.message : String(importError),
192
+ });
193
+ pluginErrors.set(id, errorMsg);
194
+ pluginCache.set(id, null);
195
+ throw new Error(errorMsg);
196
+ }
160
197
  }
161
198
  }
162
199
 
@@ -47,12 +47,19 @@ async function getTailwindBaseCSS(): Promise<string> {
47
47
  const url = getTailwindCSSUrl();
48
48
  logger.debug("Fetching base CSS", { url });
49
49
 
50
- const response = await dntShim.fetch(url);
51
- if (!response.ok) {
52
- throw new Error(`Failed to fetch Tailwind CSS: ${response.status} ${response.statusText}`);
50
+ try {
51
+ const response = await dntShim.fetch(url);
52
+ if (!response.ok) {
53
+ throw new Error(`Failed to fetch Tailwind CSS: ${response.status} ${response.statusText}`);
54
+ }
55
+ tailwindBaseCSS = await response.text();
56
+ } catch (error) {
57
+ logger.warn("Failed to fetch Tailwind base CSS, using empty fallback", {
58
+ error: error instanceof Error ? error.message : String(error),
59
+ });
60
+ tailwindBaseCSS = "";
53
61
  }
54
62
 
55
- tailwindBaseCSS = await response.text();
56
63
  return tailwindBaseCSS;
57
64
  }
58
65
 
@@ -37,30 +37,6 @@ const DEFAULT_VERSIONS: DetectedVersions = {
37
37
  veryfront: VERYFRONT_VERSION,
38
38
  };
39
39
 
40
- export async function detectVersions(projectDir: string): Promise<DetectedVersions> {
41
- try {
42
- const { createFileSystem } = await import("../platform/compat/fs.js");
43
- const fs = createFileSystem();
44
- const content = await fs.readTextFile(`${projectDir}/package.json`);
45
- const pkg = JSON.parse(content) as {
46
- dependencies?: Record<string, string>;
47
- devDependencies?: Record<string, string>;
48
- };
49
-
50
- const deps = { ...pkg.dependencies, ...pkg.devDependencies };
51
-
52
- // Use shared resolver for React version (ensures consistency with module server)
53
- const reactVersion = await resolveProjectReactVersion({ projectDir });
54
-
55
- return {
56
- react: reactVersion,
57
- veryfront: deps.veryfront ? stripSemverRange(deps.veryfront) : DEFAULT_VERSIONS.veryfront,
58
- };
59
- } catch {
60
- return DEFAULT_VERSIONS;
61
- }
62
- }
63
-
64
40
  type CdnProvider = "esm.sh" | "unpkg" | "jsdelivr";
65
41
 
66
42
  // Platform utilities served from local module server to match SSR behavior.
@@ -220,10 +196,6 @@ function getCdnImportMap(
220
196
  return (CDN_IMPORT_MAP_FACTORIES[provider] ?? getEsmShImportMap)(versions);
221
197
  }
222
198
 
223
- function getDefaultHTMLImportMap(): Record<string, string> {
224
- return getEsmShImportMap(DEFAULT_VERSIONS);
225
- }
226
-
227
199
  async function resolveVersions(
228
200
  projectDir: string,
229
201
  config?: VeryfrontConfig,
@@ -314,11 +286,6 @@ export async function buildImportMapJson(
314
286
  return JSON.stringify({ imports }, null, 2);
315
287
  }
316
288
 
317
- export function buildImportMapJsonSync(importMap?: Record<string, string>): string {
318
- const imports = importMap ?? getDefaultHTMLImportMap();
319
- return JSON.stringify({ imports }, null, 2);
320
- }
321
-
322
289
  export function shouldDisableLayout(frontmatter?: Record<string, unknown>): boolean {
323
290
  return frontmatter?.layout === false || frontmatter?.layout === "false";
324
291
  }
@@ -164,9 +164,6 @@ export class ComponentRegistry {
164
164
  return new Map(this.components);
165
165
  }
166
166
 
167
- /**
168
- * Loader accessor for compatibility with older tests; loader is not used in this registry.
169
- */
170
167
  getLoader(): ComponentLoader | undefined {
171
168
  return undefined;
172
169
  }
@@ -65,7 +65,7 @@ export function setupWebSocketHandlers(
65
65
  return;
66
66
  }
67
67
 
68
- let message: any;
68
+ let message: { type?: string };
69
69
  try {
70
70
  message = JSON.parse(event.data);
71
71
  } catch (parseError) {
@@ -14,7 +14,7 @@ import {
14
14
  } from "../../config/environment-config.js";
15
15
  import { type EnvReader, OAuthService } from "../providers/base.js";
16
16
  import { memoryTokenStore } from "../token-store/memory.js";
17
- import type { OAuthServiceConfig, TokenStore } from "../types.js";
17
+ import type { OAuthServiceConfig, OAuthState, TokenStore } from "../types.js";
18
18
 
19
19
  const logger = baseLogger.component("o-auth");
20
20
 
@@ -37,6 +37,9 @@ export interface OAuthCallbackHandlerOptions {
37
37
  /** Custom error callback */
38
38
  onError?: (serviceId: string, error: string) => void | Promise<void>;
39
39
 
40
+ /** Skip state validation for providers that don't return state */
41
+ skipStateValidation?: boolean;
42
+
40
43
  /** EnvironmentConfig for test isolation (defaults to getEnvironmentConfig()) */
41
44
  env?: EnvironmentConfig;
42
45
 
@@ -55,6 +58,7 @@ export function createOAuthCallbackHandler(
55
58
  errorRedirect = "/",
56
59
  onSuccess,
57
60
  onError,
61
+ skipStateValidation = false,
58
62
  env = getEnvironmentConfig(),
59
63
  envReader = getEnv,
60
64
  } = options;
@@ -106,12 +110,20 @@ export function createOAuthCallbackHandler(
106
110
 
107
111
  if (!code) return handleError(appUrl, "no_code");
108
112
 
109
- let oauthState: Awaited<ReturnType<TokenStore["getState"]>> | null = null;
113
+ let oauthState: OAuthState | null = null;
114
+
115
+ if (!skipStateValidation && !state) {
116
+ return handleError(appUrl, "invalid_state", "Missing state parameter", {
117
+ serviceId: config.serviceId,
118
+ });
119
+ }
120
+
110
121
  if (state) {
111
122
  oauthState = await tokenStore.getState(state);
112
- if (!oauthState) {
113
- logger.warn("Invalid or expired state", { serviceId: config.serviceId });
114
- // Continue anyway - some providers don't properly return state
123
+ if (!skipStateValidation && !oauthState) {
124
+ return handleError(appUrl, "invalid_state", "Invalid or expired state", {
125
+ serviceId: config.serviceId,
126
+ });
115
127
  }
116
128
  }
117
129
 
@@ -141,7 +141,7 @@ export class OAuthProvider {
141
141
  body: URLSearchParams,
142
142
  clientId: string,
143
143
  clientSecret: string,
144
- ): Promise<{ response: dntShim.Response; data: any }> {
144
+ ): Promise<{ response: dntShim.Response; data: Record<string, unknown> }> {
145
145
  const response = await dntShim.fetch(this.config.tokenUrl, {
146
146
  method: "POST",
147
147
  headers: this.buildTokenHeaders(clientId, clientSecret),
@@ -174,8 +174,8 @@ export class OAuthProvider {
174
174
  if (!response.ok) {
175
175
  return {
176
176
  success: false,
177
- error: data.error || errorFallback,
178
- errorDescription: data.error_description ||
177
+ error: (data.error as string) || errorFallback,
178
+ errorDescription: (data.error_description as string) ||
179
179
  (errorDescriptionFallback ? errorDescriptionFallback(response.status) : undefined),
180
180
  };
181
181
  }