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
@@ -162,16 +162,6 @@ export function getEnvBoolean(
162
162
  return fallback;
163
163
  }
164
164
 
165
- /**
166
- * Get an environment variable or throw if not set
167
- * @throws Error if the environment variable is not set
168
- */
169
- export function requireEnv(key: string): string {
170
- const value = getEnv(key);
171
- if (value === undefined) throw new Error(`Required environment variable "${key}" is not set`);
172
- return value;
173
- }
174
-
175
165
  export function setEnv(key: string, value: string): void {
176
166
  if (IS_DENO) {
177
167
  dntShim.Deno.env.set(key, value);
@@ -223,12 +213,6 @@ export function pid(): number {
223
213
  return 0;
224
214
  }
225
215
 
226
- export function ppid(): number {
227
- if (IS_DENO && "ppid" in dntShim.Deno) return dntShim.Deno.ppid || 0;
228
- if (hasNodeProcess) return nodeProcess!.ppid || 0;
229
- return 0;
230
- }
231
-
232
216
  export function memoryUsage(): {
233
217
  rss: number;
234
218
  heapTotal: number;
@@ -289,44 +273,6 @@ export function getTerminalSize(): { columns: number; rows: number } {
289
273
  return defaultSize;
290
274
  }
291
275
 
292
- /**
293
- * Get network interfaces
294
- */
295
- export async function getNetworkInterfaces(): Promise<
296
- Array<{ name: string; address: string; family: "IPv4" | "IPv6" }>
297
- > {
298
- if (IS_DENO) {
299
- return dntShim.Deno.networkInterfaces().map((iface) => ({
300
- name: iface.name,
301
- address: iface.address,
302
- family: iface.family as "IPv4" | "IPv6",
303
- }));
304
- }
305
-
306
- // Bun and Node.js both support node:os
307
- if (!hasNodeProcess && !IS_BUN) {
308
- throw new Error("networkInterfaces() is not supported in this runtime");
309
- }
310
-
311
- // Use dynamicImport to avoid static analysis by bundlers
312
- const os = await dynamicImport<typeof import("node:os")>("node:os");
313
- const interfaces = os.networkInterfaces();
314
- const result: Array<{ name: string; address: string; family: "IPv4" | "IPv6" }> = [];
315
-
316
- for (const [name, addrs] of Object.entries(interfaces)) {
317
- if (!addrs) continue;
318
- for (const addr of addrs) {
319
- result.push({
320
- name,
321
- address: addr.address,
322
- family: addr.family as "IPv4" | "IPv6",
323
- });
324
- }
325
- }
326
-
327
- return result;
328
- }
329
-
330
276
  /**
331
277
  * Get runtime version string
332
278
  */
@@ -535,10 +481,14 @@ export function readStdinByteSync(): number | null {
535
481
 
536
482
  if (IS_BUN) {
537
483
  // Bun: read one byte from the file descriptor directly
538
- // deno-lint-ignore no-explicit-any
539
- const Bun = (dntShim.dntGlobalThis as any).Bun;
540
- const chunk = Bun?.stdin?.read?.(1);
541
- if (chunk && chunk.length > 0) return chunk[0];
484
+ const BunGlobal =
485
+ (dntShim.dntGlobalThis as { Bun?: { stdin?: { read?: (n: number) => Uint8Array | null } } })
486
+ .Bun;
487
+ const chunk = BunGlobal?.stdin?.read?.(1);
488
+ if (chunk && chunk.length > 0) {
489
+ const first = chunk.at(0);
490
+ return first ?? null;
491
+ }
542
492
  return null;
543
493
  }
544
494
 
@@ -566,6 +516,61 @@ export interface CommandOptions {
566
516
  inherit?: boolean;
567
517
  /** Use shell to run the command (needed for .cmd files on Windows) */
568
518
  shell?: boolean;
519
+ /** Kill the command if it exceeds this duration (milliseconds) */
520
+ timeoutMs?: number;
521
+ }
522
+
523
+ const COMMAND_TIMEOUT_EXIT_CODE = 124;
524
+ const FORCE_KILL_GRACE_MS = 250;
525
+
526
+ function createTimeoutResult(
527
+ timeoutMs: number,
528
+ stdout?: string,
529
+ stderr?: string,
530
+ ): CommandResult {
531
+ return {
532
+ success: false,
533
+ code: COMMAND_TIMEOUT_EXIT_CODE,
534
+ stdout,
535
+ stderr: `${stderr ?? ""}\nCommand timed out after ${timeoutMs}ms`.trim(),
536
+ };
537
+ }
538
+
539
+ function createProcessTimeout(
540
+ timeoutMs: number | undefined,
541
+ terminate: () => void,
542
+ forceTerminate: () => void,
543
+ ): { hasTimedOut: () => boolean; clear: () => void } {
544
+ let timedOut = false;
545
+ let timeoutId: ReturnType<typeof dntShim.setTimeout> | undefined;
546
+ let forceKillId: ReturnType<typeof dntShim.setTimeout> | undefined;
547
+
548
+ if (timeoutMs && timeoutMs > 0) {
549
+ timeoutId = dntShim.setTimeout(() => {
550
+ timedOut = true;
551
+ try {
552
+ terminate();
553
+ } catch {
554
+ // Best-effort terminate.
555
+ }
556
+
557
+ forceKillId = dntShim.setTimeout(() => {
558
+ try {
559
+ forceTerminate();
560
+ } catch {
561
+ // Best-effort force terminate.
562
+ }
563
+ }, FORCE_KILL_GRACE_MS);
564
+ }, timeoutMs);
565
+ }
566
+
567
+ return {
568
+ hasTimedOut: () => timedOut,
569
+ clear: () => {
570
+ if (timeoutId) clearTimeout(timeoutId);
571
+ if (forceKillId) clearTimeout(forceKillId);
572
+ },
573
+ };
569
574
  }
570
575
 
571
576
  async function readStreamToString(stream: ReadableStream<Uint8Array>): Promise<string> {
@@ -604,8 +609,16 @@ export async function runCommand(
604
609
  cmd: string,
605
610
  options: CommandOptions = {},
606
611
  ): Promise<CommandResult> {
607
- const { args = [], cwd: cmdCwd, env: cmdEnv, capture = false, inherit = false, shell = false } =
608
- options;
612
+ const {
613
+ args = [],
614
+ cwd: cmdCwd,
615
+ env: cmdEnv,
616
+ capture = false,
617
+ inherit = false,
618
+ shell = false,
619
+ timeoutMs,
620
+ } = options;
621
+ const effectiveTimeoutMs = timeoutMs && timeoutMs > 0 ? Math.floor(timeoutMs) : undefined;
609
622
 
610
623
  // Determine stdio mode: inherit > capture > null
611
624
  const stdioMode = inherit ? "inherit" : capture ? "piped" : "null";
@@ -620,15 +633,31 @@ export async function runCommand(
620
633
  stderr: stdioMode,
621
634
  });
622
635
 
623
- const output = await command.output();
624
- const decoder = new TextDecoder();
636
+ const child = command.spawn();
637
+ const timeout = createProcessTimeout(
638
+ effectiveTimeoutMs,
639
+ () => child.kill("SIGTERM"),
640
+ () => child.kill("SIGKILL"),
641
+ );
625
642
 
626
- return {
627
- success: output.success,
628
- code: output.code,
629
- stdout: capture ? decoder.decode(output.stdout) : undefined,
630
- stderr: capture ? decoder.decode(output.stderr) : undefined,
631
- };
643
+ try {
644
+ const [status, stdout, stderr] = await Promise.all([
645
+ child.status,
646
+ capture && child.stdout ? readStreamToString(child.stdout) : Promise.resolve(undefined),
647
+ capture && child.stderr ? readStreamToString(child.stderr) : Promise.resolve(undefined),
648
+ ]);
649
+
650
+ if (timeout.hasTimedOut()) return createTimeoutResult(effectiveTimeoutMs!, stdout, stderr);
651
+
652
+ return {
653
+ success: status.success,
654
+ code: status.code,
655
+ stdout,
656
+ stderr,
657
+ };
658
+ } finally {
659
+ timeout.clear();
660
+ }
632
661
  }
633
662
 
634
663
  if (IS_BUN) {
@@ -644,6 +673,7 @@ export async function runCommand(
644
673
  exited: Promise<number>;
645
674
  stdout: ReadableStream<Uint8Array> | null;
646
675
  stderr: ReadableStream<Uint8Array> | null;
676
+ kill?: (signal?: string | number) => void;
647
677
  };
648
678
  };
649
679
  };
@@ -667,17 +697,25 @@ export async function runCommand(
667
697
  stderr: bunStdio,
668
698
  });
669
699
 
670
- const code = await proc.exited;
700
+ const timeout = createProcessTimeout(
701
+ effectiveTimeoutMs,
702
+ () => proc.kill?.("SIGTERM"),
703
+ () => proc.kill?.("SIGKILL"),
704
+ );
671
705
 
672
- let stdout: string | undefined;
673
- let stderr: string | undefined;
706
+ try {
707
+ const [code, stdout, stderr] = await Promise.all([
708
+ proc.exited,
709
+ capture && proc.stdout ? readStreamToString(proc.stdout) : Promise.resolve(undefined),
710
+ capture && proc.stderr ? readStreamToString(proc.stderr) : Promise.resolve(undefined),
711
+ ]);
674
712
 
675
- if (capture) {
676
- stdout = proc.stdout ? await readStreamToString(proc.stdout) : undefined;
677
- stderr = proc.stderr ? await readStreamToString(proc.stderr) : undefined;
678
- }
713
+ if (timeout.hasTimedOut()) return createTimeoutResult(effectiveTimeoutMs!, stdout, stderr);
679
714
 
680
- return { success: code === 0, code, stdout, stderr };
715
+ return { success: code === 0, code, stdout, stderr };
716
+ } finally {
717
+ timeout.clear();
718
+ }
681
719
  }
682
720
 
683
721
  if (!hasNodeProcess) return { success: false, code: 1 };
@@ -705,6 +743,11 @@ export async function runCommand(
705
743
  let stdout = "";
706
744
  let stderr = "";
707
745
  const decoder = new TextDecoder();
746
+ const timeout = createProcessTimeout(
747
+ effectiveTimeoutMs,
748
+ () => child.kill("SIGTERM"),
749
+ () => child.kill("SIGKILL"),
750
+ );
708
751
 
709
752
  if (capture) {
710
753
  child.stdout?.on("data", (data: Uint8Array) => {
@@ -716,6 +759,19 @@ export async function runCommand(
716
759
  }
717
760
 
718
761
  child.on("close", (code) => {
762
+ timeout.clear();
763
+
764
+ if (timeout.hasTimedOut()) {
765
+ resolve(
766
+ createTimeoutResult(
767
+ effectiveTimeoutMs!,
768
+ capture ? stdout : undefined,
769
+ capture ? stderr : undefined,
770
+ ),
771
+ );
772
+ return;
773
+ }
774
+
719
775
  resolve({
720
776
  success: code === 0,
721
777
  code: code ?? 1,
@@ -725,6 +781,7 @@ export async function runCommand(
725
781
  });
726
782
 
727
783
  child.on("error", () => {
784
+ timeout.clear();
728
785
  resolve({ success: false, code: 1 });
729
786
  });
730
787
  });
@@ -21,6 +21,7 @@ import "../../_dnt.polyfills.js";
21
21
  export {
22
22
  clearModelProviders,
23
23
  ensureModelReady,
24
+ findAvailableCloudModel,
24
25
  getRegisteredModelProviders,
25
26
  hasModelProvider,
26
27
  registerModelProvider,
@@ -18,22 +18,30 @@ import { isLocalAIDisabled } from "./env.js";
18
18
 
19
19
  const logger = serverLogger.component("local-llm");
20
20
 
21
+ /** Shape of a single message in the AI SDK LanguageModelV2 prompt array. */
22
+ interface PromptMessage {
23
+ role: string;
24
+ content: string | ReadonlyArray<{ type: string; text?: string }>;
25
+ }
26
+
21
27
  /**
22
28
  * Convert AI SDK LanguageModelV2 prompt format to simple ChatMessage array.
23
29
  *
24
30
  * The AI SDK prompt is an array of message objects with role and content arrays.
25
31
  * We extract text content for the local model.
26
32
  */
27
- // deno-lint-ignore no-explicit-any
28
- function convertPrompt(prompt: any[]): ChatMessage[] {
33
+ function convertPrompt(prompt: ReadonlyArray<PromptMessage>): ChatMessage[] {
29
34
  const messages: ChatMessage[] = [];
30
35
 
31
36
  for (const msg of prompt) {
32
- const role = msg.role as "system" | "user" | "assistant" | "tool";
33
37
  // Skip tool messages — local models don't support tool calling
34
- if (role === "tool") continue;
38
+ if (msg.role === "tool") continue;
35
39
 
36
- const mappedRole = role === "system" ? "system" : role === "user" ? "user" : "assistant";
40
+ const mappedRole = msg.role === "system"
41
+ ? "system"
42
+ : msg.role === "user"
43
+ ? "user"
44
+ : "assistant";
37
45
 
38
46
  // Extract text content from content array
39
47
  let text = "";
@@ -55,6 +63,27 @@ function convertPrompt(prompt: any[]): ChatMessage[] {
55
63
  return messages;
56
64
  }
57
65
 
66
+ /** AI SDK LanguageModelV2 generation options that both doGenerate and doStream receive. */
67
+ interface LocalModelOptions {
68
+ prompt: unknown[];
69
+ maxOutputTokens?: number;
70
+ temperature?: number;
71
+ topP?: number;
72
+ topK?: number;
73
+ stopSequences?: string[];
74
+ }
75
+
76
+ /** Map AI SDK generation options to local engine GenerateOptions. */
77
+ function toGenerateOptions(options: LocalModelOptions): GenerateOptions {
78
+ return {
79
+ maxNewTokens: options.maxOutputTokens ?? 512,
80
+ temperature: options.temperature ?? 0.7,
81
+ topP: options.topP,
82
+ topK: options.topK,
83
+ stopSequences: options.stopSequences,
84
+ };
85
+ }
86
+
58
87
  /**
59
88
  * Create a local AI SDK LanguageModel for the given model ID.
60
89
  *
@@ -75,22 +104,9 @@ export function createLocalModel(modelId?: string): LanguageModel {
75
104
 
76
105
  supportedUrls: {},
77
106
 
78
- async doGenerate(options: {
79
- prompt: unknown[];
80
- maxOutputTokens?: number;
81
- temperature?: number;
82
- topP?: number;
83
- topK?: number;
84
- stopSequences?: string[];
85
- }) {
86
- const messages = convertPrompt(options.prompt as unknown[]);
87
- const genOptions: GenerateOptions = {
88
- maxNewTokens: options.maxOutputTokens ?? 512,
89
- temperature: options.temperature ?? 0.7,
90
- topP: options.topP,
91
- topK: options.topK,
92
- stopSequences: options.stopSequences,
93
- };
107
+ async doGenerate(options: LocalModelOptions) {
108
+ const messages = convertPrompt(options.prompt as ReadonlyArray<PromptMessage>);
109
+ const genOptions = toGenerateOptions(options);
94
110
 
95
111
  logger.debug(`[local] doGenerate: ${messages.length} messages → ${resolvedId}`);
96
112
 
@@ -108,14 +124,7 @@ export function createLocalModel(modelId?: string): LanguageModel {
108
124
  };
109
125
  },
110
126
 
111
- async doStream(options: {
112
- prompt: unknown[];
113
- maxOutputTokens?: number;
114
- temperature?: number;
115
- topP?: number;
116
- topK?: number;
117
- stopSequences?: string[];
118
- }) {
127
+ async doStream(options: LocalModelOptions) {
119
128
  // Eagerly check if local AI is disabled — must throw before creating the
120
129
  // ReadableStream, otherwise the 200 response headers are already committed.
121
130
  // Note: getTransformers() in local-engine.ts also checks this, but we need
@@ -130,14 +139,8 @@ export function createLocalModel(modelId?: string): LanguageModel {
130
139
  );
131
140
  }
132
141
 
133
- const messages = convertPrompt(options.prompt as unknown[]);
134
- const genOptions: GenerateOptions = {
135
- maxNewTokens: options.maxOutputTokens ?? 512,
136
- temperature: options.temperature ?? 0.7,
137
- topP: options.topP,
138
- topK: options.topK,
139
- stopSequences: options.stopSequences,
140
- };
142
+ const messages = convertPrompt(options.prompt as ReadonlyArray<PromptMessage>);
143
+ const genOptions = toGenerateOptions(options);
141
144
 
142
145
  logger.debug(`[local] doStream: ${messages.length} messages → ${resolvedId}`);
143
146
 
@@ -18,7 +18,10 @@ export function isLocalAIDisabled(): boolean {
18
18
  const denoVal = (dntShim.dntGlobalThis as any).Deno?.env?.get?.("VERYFRONT_DISABLE_LOCAL_AI");
19
19
  if (denoVal === "1") return true;
20
20
 
21
- if (typeof process !== "undefined" && process.env?.VERYFRONT_DISABLE_LOCAL_AI === "1") {
21
+ if (
22
+ typeof process !== "undefined" &&
23
+ process.env?.VERYFRONT_DISABLE_LOCAL_AI === "1"
24
+ ) {
22
25
  return true;
23
26
  }
24
27
 
@@ -137,6 +137,53 @@ function autoInitializeFromEnv(): void {
137
137
  }
138
138
  }
139
139
 
140
+ /**
141
+ * Default cloud models to try when auto-upgrading from a local model.
142
+ * Ordered by preference: Anthropic → OpenAI → Google.
143
+ *
144
+ * NOTE: model IDs are hardcoded — update when default models change.
145
+ */
146
+ const CLOUD_UPGRADE_CANDIDATES: Array<{
147
+ provider: string;
148
+ model: string;
149
+ hasKey: () => boolean;
150
+ }> = [
151
+ {
152
+ provider: "anthropic",
153
+ model: "claude-sonnet-4-20250514",
154
+ hasKey: () => !!getAnthropicEnvConfig().apiKey,
155
+ },
156
+ {
157
+ provider: "openai",
158
+ model: "gpt-4o-mini",
159
+ hasKey: () => !!getOpenAIEnvConfig().apiKey,
160
+ },
161
+ {
162
+ provider: "google",
163
+ model: "gemini-2.0-flash",
164
+ hasKey: () => !!getGoogleGenAIEnvConfig().apiKey,
165
+ },
166
+ ];
167
+
168
+ /**
169
+ * Find the first cloud provider with a valid API key.
170
+ *
171
+ * Returns a "provider/model" string that can be passed to `resolveModel`,
172
+ * or `null` if no cloud provider is available.
173
+ *
174
+ * This is intentionally a **query** — it does NOT resolve the model.
175
+ * The caller (agent runtime) decides whether to use it.
176
+ */
177
+ export function findAvailableCloudModel(): string | null {
178
+ autoInitializeFromEnv();
179
+ for (const { provider, model, hasKey } of CLOUD_UPGRADE_CANDIDATES) {
180
+ if (!hasKey()) continue;
181
+ if (!manager.has(provider)) continue;
182
+ return `${provider}/${model}`;
183
+ }
184
+ return null;
185
+ }
186
+
140
187
  /**
141
188
  * Resolve a "provider/model" string to an AI SDK LanguageModel instance.
142
189
  *
@@ -6,8 +6,6 @@
6
6
  * Check if a fetch error is a transient connection error worth retrying.
7
7
  * These occur when renderer pods are being recycled or temporarily unavailable.
8
8
  */
9
- import * as dntShim from "../../_dnt.shims.js";
10
-
11
9
  export function isRetryableConnectionError(error: unknown): boolean {
12
10
  if (!(error instanceof Error)) return false;
13
11
  const msg = error.message.toLowerCase();
@@ -19,10 +17,3 @@ export function isRetryableConnectionError(error: unknown): boolean {
19
17
  msg.includes("os error 111") // ECONNREFUSED
20
18
  );
21
19
  }
22
-
23
- /**
24
- * Sleep for the specified number of milliseconds.
25
- */
26
- export function sleep(ms: number): Promise<void> {
27
- return new Promise((resolve) => dntShim.setTimeout(resolve, ms));
28
- }
@@ -69,7 +69,7 @@ async function loadApis(): Promise<void> {
69
69
  propagationApi = await import("@opentelemetry/core");
70
70
  }
71
71
 
72
- export async function initializeOTLP(): Promise<void> {
72
+ export async function initializeOTLPWithApis(): Promise<void> {
73
73
  if (initialized) return;
74
74
 
75
75
  const config = getConfig();
@@ -139,10 +139,6 @@ export async function shutdownOTLP(): Promise<void> {
139
139
  }
140
140
  }
141
141
 
142
- export function isOTLPEnabled(): boolean {
143
- return initialized && tracerProvider !== null;
144
- }
145
-
146
142
  function getPropagator(): import("@opentelemetry/core").W3CTraceContextPropagator | null {
147
143
  if (!propagationApi) return null;
148
144
  return new propagationApi.W3CTraceContextPropagator();
@@ -239,8 +235,6 @@ export function getTraceContext(): { traceId?: string; spanId?: string } {
239
235
  * Span names for proxy tracing.
240
236
  */
241
237
  export const ProxySpanNames = {
242
- PROXY_REQUEST: "proxy.request",
243
- PROXY_PROCESS: "proxy.process",
244
238
  PROXY_TOKEN_FETCH: "proxy.token_fetch",
245
239
  PROXY_DOMAIN_LOOKUP: "proxy.domain_lookup",
246
240
  OAUTH_TOKEN_REQUEST: "oauth.token_request",
@@ -282,5 +276,3 @@ export async function withSpan<T>(
282
276
  span.end();
283
277
  }
284
278
  }
285
-
286
- export { initializeOTLP as initializeOTLPWithApis };
@@ -72,7 +72,7 @@ export const RichCodeBlock = React.forwardRef<HTMLDivElement, CodeBlockProps>(
72
72
  )}
73
73
  </button>
74
74
  </div>
75
- <pre className="p-4 text-[var(--foreground)] overflow-auto text-sm">
75
+ <pre className="p-4 text-[var(--foreground)] bg-[var(--accent)] overflow-auto text-sm [&_.hljs]:bg-transparent [&_.hljs]:p-0">
76
76
  <code className={language ? `language-${language}` : undefined}>{code}</code>
77
77
  </pre>
78
78
  </div>
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Skill Badge — compact indicator for skill tool calls (load-skill, load-skill-reference, execute-skill-script).
3
+ * @module ai/react/components/chat/components/skill-badge
4
+ */
5
+
6
+ import * as React from "react";
7
+ import { cn } from "../../theme.js";
8
+ import { CheckCircleIcon, SparklesIcon, XCircleIcon } from "../../icons/index.js";
9
+ import type { DynamicToolUIPart, ToolUIPart } from "../../../../../agent/react/index.js";
10
+
11
+ export interface SkillBadgeProps {
12
+ tool: ToolUIPart | DynamicToolUIPart;
13
+ className?: string;
14
+ }
15
+
16
+ export function SkillBadge({ tool, className }: SkillBadgeProps): React.JSX.Element {
17
+ const input = tool.input as Record<string, unknown> | undefined;
18
+ const skillId = input?.skillId as string | undefined;
19
+ const isComplete = tool.state === "output-available";
20
+ const isError = tool.state === "output-error";
21
+
22
+ let label: string;
23
+ if (tool.toolName === "load-skill") {
24
+ label = isComplete
25
+ ? `Skill: ${skillId ?? "unknown"}`
26
+ : `Loading skill${skillId ? `: ${skillId}` : ""}...`;
27
+ } else if (tool.toolName === "load-skill-reference") {
28
+ const ref = input?.reference as string | undefined;
29
+ label = isComplete ? `Reference: ${ref ?? "unknown"}` : `Reading${ref ? `: ${ref}` : ""}...`;
30
+ } else {
31
+ const script = input?.script as string | undefined;
32
+ label = isComplete
33
+ ? `Script: ${script ?? "complete"}`
34
+ : `Running${script ? `: ${script}` : ""}...`;
35
+ }
36
+
37
+ return (
38
+ <span
39
+ className={cn(
40
+ "inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-medium",
41
+ "bg-[var(--accent)] text-[var(--muted-foreground)] border border-[var(--border)]",
42
+ className,
43
+ )}
44
+ >
45
+ <SparklesIcon className={cn("size-3", !isComplete && !isError && "animate-pulse")} />
46
+ <span>{label}</span>
47
+ {isComplete && <CheckCircleIcon className="size-3 text-[var(--success)]" />}
48
+ {isError && <XCircleIcon className="size-3 text-[var(--destructive)]" />}
49
+ </span>
50
+ );
51
+ }
@@ -16,15 +16,15 @@ export function StepIndicator({
16
16
  return (
17
17
  <div
18
18
  className={cn(
19
- "flex items-center gap-3 py-3 text-xs text-[var(--input-placeholder)]",
19
+ "flex items-center gap-3 py-3 text-xs text-[var(--muted-foreground)]",
20
20
  className,
21
21
  )}
22
22
  >
23
23
  <div className="flex-1 h-px bg-[var(--border)]" />
24
- <div className="flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-[var(--accent)]">
24
+ <div className="flex items-center gap-1.5 px-2 py-0.5 rounded-full border border-[var(--border)] bg-[var(--accent)]">
25
25
  {isComplete
26
- ? <CheckCircleIcon className="size-3.5 text-emerald-500" />
27
- : <span className="size-2 rounded-full bg-violet-500 animate-pulse" />}
26
+ ? <CheckCircleIcon className="size-3.5 text-[var(--success)]" />
27
+ : <span className="size-2 rounded-full bg-[var(--muted-foreground)] animate-pulse" />}
28
28
  <span className="font-medium">Step {stepIndex + 1}</span>
29
29
  </div>
30
30
  <div className="flex-1 h-px bg-[var(--border)]" />
@@ -24,10 +24,12 @@ import {
24
24
  extractSourcesFromParts,
25
25
  getTextContent,
26
26
  groupPartsInOrder,
27
+ isSkillToolPart,
27
28
  } from "../utils/message-parts.js";
28
29
  import { ConversationScrollButton } from "../components/empty-state.js";
29
30
  import { MessageActions } from "../components/message-actions.js";
30
31
  import { ReasoningCard } from "../components/reasoning.js";
32
+ import { SkillBadge } from "../components/skill-badge.js";
31
33
  import { ToolCallCard } from "../components/tool-ui.js";
32
34
 
33
35
  import { Sources } from "../components/sources.js";
@@ -320,9 +322,14 @@ function AssistantMessage({
320
322
  )
321
323
  : null;
322
324
  }
325
+ const isSkill = isSkillToolPart(group.tool);
323
326
  return (
324
- <div key={group.tool.toolCallId} className="my-3">
325
- {renderTool ? renderTool(group.tool) : <ToolCallCard tool={group.tool} />}
327
+ <div key={group.tool.toolCallId} className={isSkill ? "my-2" : "my-3"}>
328
+ {renderTool
329
+ ? renderTool(group.tool)
330
+ : isSkill
331
+ ? <SkillBadge tool={group.tool} />
332
+ : <ToolCallCard tool={group.tool} />}
326
333
  </div>
327
334
  );
328
335
  })}