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
@@ -324,10 +324,24 @@ export function createVeryfrontHandler(
324
324
  // proceeding would cause cryptic 500s deep in the rendering pipeline.
325
325
  if (isProxyMode && !isLightweightPath(url.pathname) && !isWebSocketPath(url.pathname)) {
326
326
  const token = req.headers.get("x-token");
327
- if (!headers.projectSlug) {
328
- logger.error("Missing required x-project-slug header in proxy mode", {
327
+
328
+ const missingHeader = !headers.projectSlug
329
+ ? {
330
+ error: "Missing project context",
331
+ detail: "x-project-slug header is required in proxy mode",
332
+ }
333
+ : !token
334
+ ? {
335
+ error: "Missing authentication context",
336
+ detail: "x-token header is required in proxy mode",
337
+ }
338
+ : null;
339
+
340
+ if (missingHeader) {
341
+ logger.error(missingHeader.detail, {
329
342
  pathname: url.pathname,
330
343
  domain,
344
+ projectSlug: headers.projectSlug,
331
345
  host: req.headers.get("host"),
332
346
  forwardedHost: req.headers.get("x-forwarded-host"),
333
347
  });
@@ -340,32 +354,7 @@ export function createVeryfrontHandler(
340
354
  completeIsolatedRequest(headers.projectSlug, lifecycle.shouldCheckIsolation, false);
341
355
  endRequestTracing(spanInfo.span, 502);
342
356
  return new dntShim.Response(
343
- JSON.stringify({
344
- error: "Missing project context",
345
- detail: "x-project-slug header is required in proxy mode",
346
- }),
347
- { status: 502, headers: { "Content-Type": "application/json" } },
348
- );
349
- }
350
- if (!token) {
351
- logger.error("Missing required x-token header in proxy mode", {
352
- pathname: url.pathname,
353
- domain,
354
- projectSlug: headers.projectSlug,
355
- });
356
- endContentMetrics({
357
- requestId: lifecycle.requestId,
358
- pathname: url.pathname,
359
- mode: "proxy",
360
- });
361
- completeRequestTracking(lifecycle.requestId, 502, false);
362
- completeIsolatedRequest(headers.projectSlug, lifecycle.shouldCheckIsolation, false);
363
- endRequestTracing(spanInfo.span, 502);
364
- return new dntShim.Response(
365
- JSON.stringify({
366
- error: "Missing authentication context",
367
- detail: "x-token header is required in proxy mode",
368
- }),
357
+ JSON.stringify(missingHeader),
369
358
  { status: 502, headers: { "Content-Type": "application/json" } },
370
359
  );
371
360
  }
@@ -21,7 +21,7 @@ import { getEnvNumber, getEnvString } from "../../../../platform/compat/process.
21
21
  const memoryPressureLog = rendererLogger.component("memory-pressure");
22
22
  const rendererLog = rendererLogger.component("renderer");
23
23
 
24
- export type MemoryPressureLevel = "normal" | "warning" | "high" | "critical";
24
+ type MemoryPressureLevel = "normal" | "warning" | "high" | "critical";
25
25
 
26
26
  function parseEnvThreshold(name: string, fallback: number): number {
27
27
  const value = getEnvString(name);
@@ -42,7 +42,7 @@ const THRESHOLDS = {
42
42
  CRITICAL: parseEnvThreshold("MEMORY_CRITICAL_THRESHOLD", 80),
43
43
  };
44
44
 
45
- export function getMemoryPressure(): { level: MemoryPressureLevel; heapUsedPercent: number } {
45
+ function getMemoryPressure(): { level: MemoryPressureLevel; heapUsedPercent: number } {
46
46
  const { heapUsedPercent } = getHeapStats();
47
47
 
48
48
  if (heapUsedPercent >= THRESHOLDS.CRITICAL) return { level: "critical", heapUsedPercent };
@@ -59,16 +59,3 @@ export function shouldRejectDueToMemory(): boolean {
59
59
  rendererLog.warn("Rejecting request - memory critical", { heapUsedPercent });
60
60
  return true;
61
61
  }
62
-
63
- export function getCacheTTLMultiplier(): number {
64
- const { level } = getMemoryPressure();
65
-
66
- if (level === "warning") return 0.5;
67
- if (level === "high" || level === "critical") return 0.25;
68
- return 1.0;
69
- }
70
-
71
- export function shouldEvictAggressively(): boolean {
72
- const { level } = getMemoryPressure();
73
- return level === "high" || level === "critical";
74
- }
@@ -227,10 +227,6 @@ export function clearDomainCache(): void {
227
227
  logger.debug("Cache cleared");
228
228
  }
229
229
 
230
- export function getDomainCacheStats(): { size: number; maxSize: number } {
231
- return { size: domainCache.size, maxSize: DOMAIN_CACHE_MAX_ENTRIES };
232
- }
233
-
234
230
  /**
235
231
  * Inject a CacheRepository for testing or distributed caching.
236
232
  * Call with null to restore default Map-based caching.
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Allowed-Tools Enforcement
3
+ *
4
+ * Dual-layer enforcement for skill tool access restrictions.
5
+ * Layer 1: Filter tool definitions before sending to model (planning-time)
6
+ * Layer 2: Check individual tool calls at execution time
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import { SKILL_ALLOWED_TOOL_PATTERN_REGEX, SKILL_TOOL_IDS } from "./types.js";
12
+ import { createError, toError } from "../errors/veryfront-error.js";
13
+
14
+ /**
15
+ * Check if a tool name matches a single allowed-tools pattern.
16
+ *
17
+ * Supports:
18
+ * - Exact match: "Read" matches "Read"
19
+ * - Prefix wildcard: "api:*" matches "api:list-users"
20
+ */
21
+ export function matchesAllowedTool(toolName: string, pattern: string): boolean {
22
+ // Invalid patterns always fail (fail closed)
23
+ if (!SKILL_ALLOWED_TOOL_PATTERN_REGEX.test(pattern)) {
24
+ return false;
25
+ }
26
+
27
+ // Prefix wildcard
28
+ if (pattern.endsWith(":*")) {
29
+ const prefix = pattern.slice(0, -1); // keep the colon: "api:"
30
+ return toolName.startsWith(prefix);
31
+ }
32
+
33
+ // Exact match
34
+ return toolName === pattern;
35
+ }
36
+
37
+ /** Minimal tool definition shape for filtering */
38
+ export interface FilterableToolDefinition {
39
+ name: string;
40
+ description: string;
41
+ parameters: unknown;
42
+ }
43
+
44
+ /**
45
+ * Layer 1: Filter tool definitions before sending to model.
46
+ *
47
+ * Removes tools not in the allowed list. Always-allowed tools
48
+ * (skill system tools) pass through regardless.
49
+ *
50
+ * @param tools - Full list of tool definitions
51
+ * @param allowedTools - Allowed tool patterns, or undefined for no restrictions
52
+ * @returns Filtered tool definitions
53
+ */
54
+ export function filterToolsForSkill<T extends FilterableToolDefinition>(
55
+ tools: T[],
56
+ allowedTools: string[] | undefined,
57
+ ): T[] {
58
+ if (allowedTools === undefined) {
59
+ return tools;
60
+ }
61
+
62
+ return tools.filter((tool) => {
63
+ if (SKILL_TOOL_IDS.has(tool.name)) return true;
64
+ return allowedTools.some((pattern) => matchesAllowedTool(tool.name, pattern));
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Layer 2: Check if a specific tool call is allowed at execution time.
70
+ *
71
+ * @param toolName - Name of the tool being called
72
+ * @param allowedTools - Allowed tool patterns, or undefined for no restrictions
73
+ * @returns true if the tool call is allowed
74
+ */
75
+ export function isToolAllowedBySkill(
76
+ toolName: string,
77
+ allowedTools: string[] | undefined,
78
+ ): boolean {
79
+ if (allowedTools === undefined) return true;
80
+ if (SKILL_TOOL_IDS.has(toolName)) return true;
81
+ return allowedTools.some((pattern) => matchesAllowedTool(toolName, pattern));
82
+ }
83
+
84
+ /**
85
+ * Validate allowed-tool patterns at parse time.
86
+ *
87
+ * Ensures each pattern matches the expected format.
88
+ * Rejects unsupported patterns with a descriptive error (fail closed).
89
+ *
90
+ * @param patterns - Array of tool patterns to validate
91
+ * @returns Validated patterns (same array if all valid)
92
+ * @throws If any pattern is invalid
93
+ */
94
+ export function validateAllowedToolPatterns(patterns: string[]): string[] {
95
+ for (const pattern of patterns) {
96
+ if (!SKILL_ALLOWED_TOOL_PATTERN_REGEX.test(pattern)) {
97
+ throw toError(
98
+ createError({
99
+ type: "agent",
100
+ message: `Invalid allowed-tools pattern "${pattern}". ` +
101
+ `Only exact tool IDs (e.g. "Read") and prefix wildcards (e.g. "api:*") are supported.`,
102
+ }),
103
+ );
104
+ }
105
+ }
106
+ return patterns;
107
+ }
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Skill Script Executor
3
+ *
4
+ * Executes skill scripts using cross-runtime subprocess execution.
5
+ *
6
+ * @module
7
+ */
8
+ import * as dntShim from "../../_dnt.shims.js";
9
+
10
+
11
+ import { getEnv, runCommand } from "../platform/compat/process.js";
12
+ import { isDeno } from "../platform/compat/runtime.js";
13
+ import { extname } from "../platform/compat/path/index.js";
14
+ import { readTextFile } from "../platform/compat/fs.js";
15
+ import { createError, toError } from "../errors/veryfront-error.js";
16
+ import type { SkillScriptExecutor, SkillScriptExecutorInput, SkillScriptResult } from "./types.js";
17
+
18
+ const DEFAULT_SCRIPT_TIMEOUT_MS = 60_000;
19
+ const MAX_SCRIPT_TIMEOUT_MS = 300_000;
20
+ const TIMEOUT_EXIT_CODE = 124;
21
+ const ENV_KEY_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
22
+ const TIMEOUT_SENTINEL = Symbol("skill-script-timeout");
23
+
24
+ function resolveTimeoutMs(timeoutMs?: number): number {
25
+ if (timeoutMs === undefined || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
26
+ return DEFAULT_SCRIPT_TIMEOUT_MS;
27
+ }
28
+ return Math.min(Math.floor(timeoutMs), MAX_SCRIPT_TIMEOUT_MS);
29
+ }
30
+
31
+ async function withTimeout<T>(
32
+ promise: Promise<T>,
33
+ timeoutMs: number,
34
+ ): Promise<T | typeof TIMEOUT_SENTINEL> {
35
+ let timeoutId: ReturnType<typeof dntShim.setTimeout> | undefined;
36
+ const timeoutPromise = new Promise<typeof TIMEOUT_SENTINEL>((resolve) => {
37
+ timeoutId = dntShim.setTimeout(() => resolve(TIMEOUT_SENTINEL), timeoutMs);
38
+ });
39
+
40
+ try {
41
+ return await Promise.race([promise, timeoutPromise]);
42
+ } finally {
43
+ if (timeoutId) clearTimeout(timeoutId);
44
+ }
45
+ }
46
+
47
+ function timeoutResult(timeoutMs: number): SkillScriptResult {
48
+ return {
49
+ stdout: "",
50
+ stderr: `Script execution timed out after ${timeoutMs}ms`,
51
+ exitCode: TIMEOUT_EXIT_CODE,
52
+ };
53
+ }
54
+
55
+ function shellEscapeArg(value: string): string {
56
+ return `'${value.replaceAll("'", "'\"'\"'")}'`;
57
+ }
58
+
59
+ function buildShellCommand(parts: string[]): string {
60
+ return parts.map(shellEscapeArg).join(" ");
61
+ }
62
+
63
+ function formatEnvAssignments(env?: Record<string, string>): string[] {
64
+ if (!env) return [];
65
+ return Object.entries(env).map(([key, value]) => {
66
+ if (!ENV_KEY_REGEX.test(key)) {
67
+ throw toError(
68
+ createError({
69
+ type: "agent",
70
+ message: `Invalid environment variable name: "${key}"`,
71
+ }),
72
+ );
73
+ }
74
+ return `${key}=${value}`;
75
+ });
76
+ }
77
+
78
+ function createSandboxScriptPath(scriptPath: string): string {
79
+ const ext = extname(scriptPath) || ".sh";
80
+ const suffix = Math.random().toString(36).slice(2, 10);
81
+ return `/tmp/veryfront-skill-script-${Date.now()}-${suffix}${ext}`;
82
+ }
83
+
84
+ /**
85
+ * Detect the runtime command for a script based on file extension.
86
+ */
87
+ export function detectRuntime(scriptPath: string): { command: string; args: string[] } {
88
+ const ext = extname(scriptPath).toLowerCase();
89
+
90
+ switch (ext) {
91
+ case ".py":
92
+ return { command: "python3", args: [scriptPath] };
93
+ case ".sh":
94
+ return { command: "bash", args: [scriptPath] };
95
+ case ".js":
96
+ return { command: "node", args: [scriptPath] };
97
+ case ".ts":
98
+ if (isDeno) {
99
+ return {
100
+ command: "deno",
101
+ args: ["run", "--allow-read", "--allow-env", "--allow-net", "--allow-write", scriptPath],
102
+ };
103
+ }
104
+ return { command: "npx", args: ["tsx", scriptPath] };
105
+ default:
106
+ return { command: scriptPath, args: [] };
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Local script executor using runCommand() from the compat layer.
112
+ */
113
+ export class LocalScriptExecutor implements SkillScriptExecutor {
114
+ async execute(input: SkillScriptExecutorInput): Promise<SkillScriptResult> {
115
+ const timeoutMs = resolveTimeoutMs(input.timeoutMs);
116
+ const { command, args: runtimeArgs } = detectRuntime(input.scriptPath);
117
+ const allArgs = [...runtimeArgs, ...(input.args ?? [])];
118
+
119
+ // Remove the script path from args if it's already the command
120
+ const finalArgs = command === input.scriptPath ? (input.args ?? []) : allArgs;
121
+
122
+ const result = await runCommand(command, {
123
+ args: finalArgs,
124
+ cwd: input.cwd,
125
+ env: input.env,
126
+ capture: true,
127
+ timeoutMs,
128
+ });
129
+
130
+ return {
131
+ stdout: result.stdout ?? "",
132
+ stderr: result.stderr ?? "",
133
+ exitCode: result.code,
134
+ };
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Cloud script executor using sandbox.
140
+ * Requires SANDBOX_AUTH_TOKEN environment variable.
141
+ */
142
+ export class CloudScriptExecutor implements SkillScriptExecutor {
143
+ async execute(input: SkillScriptExecutorInput): Promise<SkillScriptResult> {
144
+ const timeoutMs = resolveTimeoutMs(input.timeoutMs);
145
+ // NOTE: In SSR contexts, getEnv() reads through the project-env overlay
146
+ // (AsyncLocalStorage-backed). If the token is set at host level only,
147
+ // the overlay may not surface it. Ensure SANDBOX_AUTH_TOKEN is available
148
+ // in the request-scoped environment when running under SSR.
149
+ const authToken = getEnv("SANDBOX_AUTH_TOKEN");
150
+ if (!authToken) {
151
+ throw toError(
152
+ createError({
153
+ type: "agent",
154
+ message: "Cloud script execution requires SANDBOX_AUTH_TOKEN environment variable",
155
+ }),
156
+ );
157
+ }
158
+
159
+ // Lazy import to avoid bundling sandbox in non-cloud environments
160
+ const { Sandbox } = await import("../sandbox/index.js");
161
+ const sandbox = await Sandbox.create({ authToken });
162
+ try {
163
+ const sandboxScriptPath = createSandboxScriptPath(input.scriptPath);
164
+ const scriptContent = input.scriptContent ?? await readTextFile(input.scriptPath);
165
+
166
+ await sandbox.writeFiles([{ path: sandboxScriptPath, content: scriptContent }]);
167
+ await sandbox.executeCommand(buildShellCommand(["chmod", "+x", sandboxScriptPath]));
168
+
169
+ const { command, args: runtimeArgs } = detectRuntime(sandboxScriptPath);
170
+ const allArgs = [...runtimeArgs, ...(input.args ?? [])];
171
+ const finalArgs = command === sandboxScriptPath ? (input.args ?? []) : allArgs;
172
+
173
+ const envAssignments = formatEnvAssignments(input.env);
174
+ const commandParts = envAssignments.length > 0
175
+ ? ["env", ...envAssignments, command, ...finalArgs]
176
+ : [command, ...finalArgs];
177
+
178
+ const cmdString = buildShellCommand(commandParts);
179
+ const commandPromise = sandbox.executeCommand(cmdString);
180
+ const result = await withTimeout(commandPromise, timeoutMs);
181
+
182
+ if (result === TIMEOUT_SENTINEL) {
183
+ // Kill any running processes before returning — withTimeout only
184
+ // races the timer, it doesn't terminate the sandbox command.
185
+ try {
186
+ await sandbox.executeCommand("kill -9 -1 2>/dev/null || true");
187
+ } catch {
188
+ // Best-effort kill; sandbox.close() in finally will clean up.
189
+ }
190
+ return timeoutResult(timeoutMs);
191
+ }
192
+
193
+ return {
194
+ stdout: result.stdout,
195
+ stderr: result.stderr,
196
+ exitCode: result.exitCode,
197
+ };
198
+ } finally {
199
+ try {
200
+ await sandbox.close();
201
+ } catch {
202
+ // Best-effort cleanup.
203
+ }
204
+ }
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Get the appropriate script executor.
210
+ * Checks SANDBOX_AUTH_TOKEN on every call so request-scoped env overlays
211
+ * (e.g. project-env AsyncLocalStorage) are respected.
212
+ */
213
+ export function getSkillScriptExecutor(): SkillScriptExecutor {
214
+ return getEnv("SANDBOX_AUTH_TOKEN") ? new CloudScriptExecutor() : new LocalScriptExecutor();
215
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Agent Skills
3
+ *
4
+ * Public API for the agent skills system.
5
+ * Skills are project-level capabilities defined as SKILL.md files
6
+ * following the agentskills.io specification.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ // Types
12
+ export type {
13
+ ActiveSkillContext,
14
+ Skill,
15
+ SkillContent,
16
+ SkillMetadata,
17
+ SkillScriptExecutor,
18
+ SkillScriptExecutorInput,
19
+ SkillScriptResult,
20
+ } from "./types.js";
21
+
22
+ export {
23
+ SKILL_ALLOWED_TOOL_PATTERN_REGEX,
24
+ SKILL_ASSETS_DIR,
25
+ SKILL_DESCRIPTION_MAX_LENGTH,
26
+ SKILL_MD_FILENAME,
27
+ SKILL_NAME_REGEX,
28
+ SKILL_REFERENCES_DIR,
29
+ SKILL_SCRIPTS_DIR,
30
+ SKILL_TOOL_IDS,
31
+ } from "./types.js";
32
+
33
+ // Registry
34
+ export { getAllSkills, getSkill, registerSkill, skillRegistry } from "./registry.js";
35
+
36
+ // Parser
37
+ export { parseSkillFrontmatter, validateSkillMetadata } from "./parser.js";
38
+
39
+ // Path Safety
40
+ export { listSkillSubdir, validateSkillPath } from "./path-safety.js";
41
+
42
+ // Tools
43
+ export {
44
+ createExecuteSkillScriptTool,
45
+ createLoadSkillReferenceTool,
46
+ createLoadSkillTool,
47
+ } from "./tools.js";
48
+
49
+ // Executor
50
+ export { getSkillScriptExecutor } from "./executor.js";
51
+
52
+ // Prompt
53
+ export { buildSkillManifestPrompt } from "./prompt-augmentation.js";
54
+
55
+ // Allowed-Tools
56
+ export {
57
+ filterToolsForSkill,
58
+ isToolAllowedBySkill,
59
+ validateAllowedToolPatterns,
60
+ } from "./allowed-tools.js";
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Skill frontmatter parser
3
+ *
4
+ * Parses SKILL.md files with YAML frontmatter.
5
+ * Primary parser: gray-matter shim (#std/front-matter/yaml.ts)
6
+ * Fallback: regex + line-by-line parser
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import { createError, toError } from "../errors/veryfront-error.js";
12
+ import {
13
+ SKILL_ALLOWED_TOOL_PATTERN_REGEX,
14
+ SKILL_DESCRIPTION_MAX_LENGTH,
15
+ SKILL_NAME_REGEX,
16
+ type SkillMetadata,
17
+ } from "./types.js";
18
+
19
+ /** Result of parsing a SKILL.md file */
20
+ export interface ParsedSkillContent {
21
+ frontmatter: Record<string, unknown>;
22
+ body: string;
23
+ }
24
+
25
+ /**
26
+ * Parse SKILL.md content into frontmatter + body.
27
+ *
28
+ * Uses gray-matter shim as primary parser with a regex fallback
29
+ * for environments where gray-matter is not available.
30
+ */
31
+ export async function parseSkillFrontmatter(content: string): Promise<ParsedSkillContent> {
32
+ // Try primary parser: gray-matter shim
33
+ try {
34
+ const { extract } = await import("../platform/compat/std/front-matter-yaml.js");
35
+ const result = extract<Record<string, unknown>>(content);
36
+ return { frontmatter: result.attrs, body: result.body };
37
+ } catch {
38
+ // Fall through to fallback
39
+ }
40
+
41
+ // Fallback: regex-based parser
42
+ return parseFrontmatterFallback(content);
43
+ }
44
+
45
+ /**
46
+ * Regex-based fallback parser for YAML frontmatter.
47
+ * Handles simple key: value pairs (no nested YAML).
48
+ */
49
+ function parseFrontmatterFallback(content: string): ParsedSkillContent {
50
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
51
+ if (!match) {
52
+ return { frontmatter: {}, body: content };
53
+ }
54
+
55
+ const rawFrontmatter = match[1]!;
56
+ const body = match[2]!;
57
+ const frontmatter: Record<string, unknown> = {};
58
+
59
+ for (const line of rawFrontmatter.split("\n")) {
60
+ const trimmed = line.trim();
61
+ if (!trimmed || trimmed.startsWith("#")) continue;
62
+
63
+ const colonIndex = trimmed.indexOf(":");
64
+ if (colonIndex === -1) continue;
65
+
66
+ const key = trimmed.slice(0, colonIndex).trim();
67
+ const value = trimmed.slice(colonIndex + 1).trim();
68
+ frontmatter[key] = value;
69
+ }
70
+
71
+ return { frontmatter, body };
72
+ }
73
+
74
+ /**
75
+ * Validate and normalize parsed frontmatter into SkillMetadata.
76
+ *
77
+ * @param frontmatter - Parsed frontmatter object
78
+ * @param directoryName - Directory name used as fallback for skill name
79
+ */
80
+ export function validateSkillMetadata(
81
+ frontmatter: Record<string, unknown>,
82
+ directoryName: string,
83
+ ): SkillMetadata {
84
+ // Name: from frontmatter or directory name
85
+ const rawName = typeof frontmatter.name === "string" ? frontmatter.name.trim() : directoryName;
86
+
87
+ if (!SKILL_NAME_REGEX.test(rawName)) {
88
+ throw toError(
89
+ createError({
90
+ type: "agent",
91
+ message:
92
+ `Invalid skill name "${rawName}": must be lowercase alphanumeric with hyphens, 1-64 characters`,
93
+ }),
94
+ );
95
+ }
96
+
97
+ // Description: required
98
+ const rawDescription = frontmatter.description;
99
+ if (!rawDescription || typeof rawDescription !== "string" || !rawDescription.trim()) {
100
+ throw toError(
101
+ createError({
102
+ type: "agent",
103
+ message: `Skill "${rawName}" is missing a required "description" field`,
104
+ }),
105
+ );
106
+ }
107
+
108
+ const description = rawDescription.trim().slice(0, SKILL_DESCRIPTION_MAX_LENGTH);
109
+
110
+ // Allowed-tools: parse from space-delimited string or array
111
+ const allowedTools = parseAllowedTools(frontmatter["allowed-tools"], rawName);
112
+
113
+ // License: optional string passthrough
114
+ const license = typeof frontmatter.license === "string" ? frontmatter.license.trim() : undefined;
115
+
116
+ // Compatibility: optional string passthrough
117
+ const compatibility = typeof frontmatter.compatibility === "string"
118
+ ? frontmatter.compatibility.trim()
119
+ : undefined;
120
+
121
+ // Metadata: convert nested object values to strings
122
+ const metadata = parseMetadata(frontmatter.metadata);
123
+
124
+ return {
125
+ name: rawName,
126
+ description,
127
+ ...(allowedTools && { allowedTools }),
128
+ ...(license && { license }),
129
+ ...(compatibility && { compatibility }),
130
+ ...(metadata && { metadata }),
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Parse `allowed-tools` from frontmatter.
136
+ * Accepts a space-delimited string or an array of strings.
137
+ * Validates each pattern against SKILL_ALLOWED_TOOL_PATTERN_REGEX.
138
+ */
139
+ function parseAllowedTools(
140
+ value: unknown,
141
+ skillName: string,
142
+ ): string[] | undefined {
143
+ if (value === undefined || value === null) return undefined;
144
+
145
+ let patterns: string[];
146
+
147
+ if (typeof value === "string") {
148
+ patterns = value.split(/\s+/).filter(Boolean);
149
+ } else if (Array.isArray(value)) {
150
+ patterns = [];
151
+ for (const rawPattern of value) {
152
+ if (typeof rawPattern !== "string") {
153
+ throw toError(
154
+ createError({
155
+ type: "agent",
156
+ message:
157
+ `Skill "${skillName}" has invalid allowed-tools value: expected all entries to be strings`,
158
+ }),
159
+ );
160
+ }
161
+ const pattern = rawPattern.trim();
162
+ if (!pattern) {
163
+ throw toError(
164
+ createError({
165
+ type: "agent",
166
+ message: `Skill "${skillName}" has invalid allowed-tools pattern: empty value`,
167
+ }),
168
+ );
169
+ }
170
+ patterns.push(pattern);
171
+ }
172
+ } else {
173
+ throw toError(
174
+ createError({
175
+ type: "agent",
176
+ message:
177
+ `Skill "${skillName}" has invalid allowed-tools value: expected a string or array of strings, got ${typeof value}`,
178
+ }),
179
+ );
180
+ }
181
+
182
+ if (patterns.length === 0) return undefined;
183
+
184
+ // Validate each pattern (fail closed)
185
+ for (const pattern of patterns) {
186
+ if (!SKILL_ALLOWED_TOOL_PATTERN_REGEX.test(pattern)) {
187
+ throw toError(
188
+ createError({
189
+ type: "agent",
190
+ message: `Skill "${skillName}" has invalid allowed-tools pattern "${pattern}". ` +
191
+ `Only exact tool IDs (e.g. "Read") and prefix wildcards (e.g. "api:*") are supported.`,
192
+ }),
193
+ );
194
+ }
195
+ }
196
+
197
+ return patterns;
198
+ }
199
+
200
+ /** Convert metadata object values to strings */
201
+ function parseMetadata(
202
+ value: unknown,
203
+ ): Record<string, string> | undefined {
204
+ if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
205
+
206
+ const entries = Object.entries(value as Record<string, unknown>);
207
+ if (entries.length === 0) return undefined;
208
+
209
+ const result: Record<string, string> = {};
210
+ for (const [k, v] of entries) {
211
+ result[k] = String(v);
212
+ }
213
+ return result;
214
+ }