veryfront 0.1.215 → 0.1.217

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 (305) hide show
  1. package/README.md +1 -1
  2. package/esm/cli/commands/extension/command-help.d.ts +3 -0
  3. package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
  4. package/esm/cli/commands/extension/command-help.js +16 -0
  5. package/esm/cli/commands/extension/handler.d.ts +3 -0
  6. package/esm/cli/commands/extension/handler.d.ts.map +1 -0
  7. package/esm/cli/commands/extension/handler.js +36 -0
  8. package/esm/cli/commands/extension/init-command.d.ts +19 -0
  9. package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
  10. package/esm/cli/commands/extension/init-command.js +122 -0
  11. package/esm/cli/commands/extension/validate-command.d.ts +13 -0
  12. package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
  13. package/esm/cli/commands/extension/validate-command.js +62 -0
  14. package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
  15. package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
  16. package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
  17. package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
  18. package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
  19. package/esm/cli/commands/generate/integration-generator.js +1 -123
  20. package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
  21. package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
  22. package/esm/cli/commands/knowledge/command-helpers.js +216 -0
  23. package/esm/cli/commands/knowledge/command.d.ts +12 -17
  24. package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
  25. package/esm/cli/commands/knowledge/command.js +26 -214
  26. package/esm/cli/help/command-definitions.d.ts.map +1 -1
  27. package/esm/cli/help/command-definitions.js +2 -0
  28. package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
  29. package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
  30. package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
  31. package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
  32. package/esm/cli/mcp/remote-file-tools.js +1 -22
  33. package/esm/cli/router.d.ts.map +1 -1
  34. package/esm/cli/router.js +2 -0
  35. package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
  36. package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
  37. package/esm/cli/templates/integration-loader-helpers.js +29 -0
  38. package/esm/cli/templates/integration-loader.d.ts.map +1 -1
  39. package/esm/cli/templates/integration-loader.js +5 -21
  40. package/esm/cli/templates/manifest.d.ts +1 -0
  41. package/esm/cli/templates/manifest.js +2 -1
  42. package/esm/deno.d.ts +3 -0
  43. package/esm/deno.js +5 -2
  44. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  45. package/esm/src/agent/runtime/index.js +48 -90
  46. package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
  47. package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
  48. package/esm/src/chat/ag-ui-helpers.js +111 -0
  49. package/esm/src/chat/ag-ui.d.ts.map +1 -1
  50. package/esm/src/chat/ag-ui.js +1 -111
  51. package/esm/src/config/schemas/config.schema.d.ts +1 -0
  52. package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
  53. package/esm/src/config/schemas/config.schema.js +11 -0
  54. package/esm/src/config/schemas/index.d.ts +11 -1
  55. package/esm/src/config/schemas/index.d.ts.map +1 -1
  56. package/esm/src/errors/error-registry-helpers.d.ts +6 -0
  57. package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
  58. package/esm/src/errors/error-registry-helpers.js +9 -0
  59. package/esm/src/errors/error-registry.d.ts.map +1 -1
  60. package/esm/src/errors/error-registry.js +4 -3
  61. package/esm/src/extensions/capabilities.d.ts +20 -0
  62. package/esm/src/extensions/capabilities.d.ts.map +1 -0
  63. package/esm/src/extensions/capabilities.js +77 -0
  64. package/esm/src/extensions/contracts.d.ts +10 -0
  65. package/esm/src/extensions/contracts.d.ts.map +1 -0
  66. package/esm/src/extensions/contracts.js +28 -0
  67. package/esm/src/extensions/discovery.d.ts +48 -0
  68. package/esm/src/extensions/discovery.d.ts.map +1 -0
  69. package/esm/src/extensions/discovery.js +179 -0
  70. package/esm/src/extensions/errors.d.ts +10 -0
  71. package/esm/src/extensions/errors.d.ts.map +1 -0
  72. package/esm/src/extensions/errors.js +34 -0
  73. package/esm/src/extensions/factory-loader.d.ts +29 -0
  74. package/esm/src/extensions/factory-loader.d.ts.map +1 -0
  75. package/esm/src/extensions/factory-loader.js +63 -0
  76. package/esm/src/extensions/index.d.ts +37 -0
  77. package/esm/src/extensions/index.d.ts.map +1 -0
  78. package/esm/src/extensions/index.js +41 -0
  79. package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
  80. package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
  81. package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
  82. package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
  83. package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
  84. package/esm/src/extensions/interfaces/auth-provider.js +8 -0
  85. package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
  86. package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
  87. package/esm/src/extensions/interfaces/bundler.js +8 -0
  88. package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
  89. package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
  90. package/esm/src/extensions/interfaces/cache-store.js +8 -0
  91. package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
  92. package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
  93. package/esm/src/extensions/interfaces/code-parser.js +8 -0
  94. package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
  95. package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
  96. package/esm/src/extensions/interfaces/content-transformer.js +8 -0
  97. package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
  98. package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
  99. package/esm/src/extensions/interfaces/css-processor.js +8 -0
  100. package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
  101. package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
  102. package/esm/src/extensions/interfaces/database-client.js +8 -0
  103. package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
  104. package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
  105. package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
  106. package/esm/src/extensions/interfaces/index.d.ts +21 -0
  107. package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
  108. package/esm/src/extensions/interfaces/index.js +9 -0
  109. package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
  110. package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
  111. package/esm/src/extensions/interfaces/node-compat.js +8 -0
  112. package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
  113. package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
  114. package/esm/src/extensions/interfaces/schema-validator.js +8 -0
  115. package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
  116. package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
  117. package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
  118. package/esm/src/extensions/loader.d.ts +33 -0
  119. package/esm/src/extensions/loader.d.ts.map +1 -0
  120. package/esm/src/extensions/loader.js +209 -0
  121. package/esm/src/extensions/orchestrate.d.ts +54 -0
  122. package/esm/src/extensions/orchestrate.d.ts.map +1 -0
  123. package/esm/src/extensions/orchestrate.js +116 -0
  124. package/esm/src/extensions/recommendations.d.ts +7 -0
  125. package/esm/src/extensions/recommendations.d.ts.map +1 -0
  126. package/esm/src/extensions/recommendations.js +22 -0
  127. package/esm/src/extensions/types.d.ts +47 -0
  128. package/esm/src/extensions/types.d.ts.map +1 -0
  129. package/esm/src/extensions/types.js +6 -0
  130. package/esm/src/extensions/validation.d.ts +44 -0
  131. package/esm/src/extensions/validation.d.ts.map +1 -0
  132. package/esm/src/extensions/validation.js +115 -0
  133. package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
  134. package/esm/src/html/styles-builder/plugin-loader.js +23 -0
  135. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
  136. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
  137. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
  138. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
  139. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
  140. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
  141. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
  142. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  143. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
  144. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
  145. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
  146. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
  147. package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
  148. package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
  149. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
  150. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
  151. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
  152. package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
  153. package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
  154. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
  155. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
  156. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
  157. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
  158. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
  159. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
  160. package/esm/src/platform/compat/process/command.d.ts +31 -0
  161. package/esm/src/platform/compat/process/command.d.ts.map +1 -0
  162. package/esm/src/platform/compat/process/command.js +193 -0
  163. package/esm/src/platform/compat/process/env.d.ts +31 -0
  164. package/esm/src/platform/compat/process/env.d.ts.map +1 -0
  165. package/esm/src/platform/compat/process/env.js +175 -0
  166. package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
  167. package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
  168. package/esm/src/platform/compat/process/lifecycle.js +305 -0
  169. package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
  170. package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
  171. package/esm/src/platform/compat/process/runtime-process.js +24 -0
  172. package/esm/src/platform/compat/process.d.ts +4 -165
  173. package/esm/src/platform/compat/process.d.ts.map +1 -1
  174. package/esm/src/platform/compat/process.js +4 -682
  175. package/esm/src/platform/index.d.ts +1 -1
  176. package/esm/src/platform/index.d.ts.map +1 -1
  177. package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
  178. package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
  179. package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
  180. package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
  181. package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
  182. package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
  183. package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
  184. package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
  185. package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
  186. package/esm/src/provider/runtime-loader.d.ts +2 -3
  187. package/esm/src/provider/runtime-loader.d.ts.map +1 -1
  188. package/esm/src/provider/runtime-loader.js +92 -291
  189. package/esm/src/proxy/handler.d.ts.map +1 -1
  190. package/esm/src/proxy/handler.js +14 -0
  191. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
  192. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
  193. package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
  194. package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
  195. package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
  196. package/esm/src/rendering/orchestrator/pipeline.js +4 -22
  197. package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
  198. package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
  199. package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
  200. package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
  201. package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
  202. package/esm/src/routing/api/module-loader/loader.js +2 -60
  203. package/esm/src/server/bootstrap.d.ts +22 -2
  204. package/esm/src/server/bootstrap.d.ts.map +1 -1
  205. package/esm/src/server/bootstrap.js +67 -5
  206. package/esm/src/server/dev-ui/manifest.d.ts +2 -0
  207. package/esm/src/server/dev-ui/manifest.js +3 -1
  208. package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
  209. package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
  210. package/esm/src/server/production-server.js +1 -1
  211. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
  212. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
  213. package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
  214. package/esm/src/server/utils/domain-parser.js +4 -0
  215. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
  216. package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
  217. package/esm/src/tool/index.d.ts +1 -1
  218. package/esm/src/tool/index.d.ts.map +1 -1
  219. package/esm/src/tool/types.d.ts +20 -0
  220. package/esm/src/tool/types.d.ts.map +1 -1
  221. package/esm/src/utils/version-constant.d.ts +1 -1
  222. package/esm/src/utils/version-constant.js +1 -1
  223. package/package.json +7 -1
  224. package/src/cli/commands/extension/command-help.ts +18 -0
  225. package/src/cli/commands/extension/handler.ts +41 -0
  226. package/src/cli/commands/extension/init-command.ts +140 -0
  227. package/src/cli/commands/extension/validate-command.ts +78 -0
  228. package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
  229. package/src/cli/commands/generate/integration-generator.ts +12 -168
  230. package/src/cli/commands/knowledge/command-helpers.ts +295 -0
  231. package/src/cli/commands/knowledge/command.ts +34 -261
  232. package/src/cli/help/command-definitions.ts +2 -0
  233. package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
  234. package/src/cli/mcp/remote-file-tools.ts +6 -28
  235. package/src/cli/router.ts +2 -0
  236. package/src/cli/templates/integration-loader-helpers.ts +49 -0
  237. package/src/cli/templates/integration-loader.ts +10 -28
  238. package/src/cli/templates/manifest.js +2 -1
  239. package/src/deno.js +5 -2
  240. package/src/src/agent/runtime/index.ts +77 -94
  241. package/src/src/chat/ag-ui-helpers.ts +139 -0
  242. package/src/src/chat/ag-ui.ts +11 -139
  243. package/src/src/config/schemas/config.schema.ts +11 -0
  244. package/src/src/config/schemas/index.ts +15 -1
  245. package/src/src/errors/error-registry-helpers.ts +23 -0
  246. package/src/src/errors/error-registry.ts +8 -3
  247. package/src/src/extensions/capabilities.ts +97 -0
  248. package/src/src/extensions/contracts.ts +36 -0
  249. package/src/src/extensions/discovery.ts +221 -0
  250. package/src/src/extensions/errors.ts +39 -0
  251. package/src/src/extensions/factory-loader.ts +76 -0
  252. package/src/src/extensions/index.ts +79 -0
  253. package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
  254. package/src/src/extensions/interfaces/auth-provider.ts +52 -0
  255. package/src/src/extensions/interfaces/bundler.ts +116 -0
  256. package/src/src/extensions/interfaces/cache-store.ts +27 -0
  257. package/src/src/extensions/interfaces/code-parser.ts +84 -0
  258. package/src/src/extensions/interfaces/content-transformer.ts +38 -0
  259. package/src/src/extensions/interfaces/css-processor.ts +40 -0
  260. package/src/src/extensions/interfaces/database-client.ts +35 -0
  261. package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
  262. package/src/src/extensions/interfaces/index.ts +81 -0
  263. package/src/src/extensions/interfaces/node-compat.ts +25 -0
  264. package/src/src/extensions/interfaces/schema-validator.ts +51 -0
  265. package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
  266. package/src/src/extensions/loader.ts +245 -0
  267. package/src/src/extensions/orchestrate.ts +184 -0
  268. package/src/src/extensions/recommendations.ts +24 -0
  269. package/src/src/extensions/types.ts +57 -0
  270. package/src/src/extensions/validation.ts +147 -0
  271. package/src/src/html/styles-builder/plugin-loader.ts +32 -0
  272. package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
  273. package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
  274. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
  275. package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
  276. package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
  277. package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
  278. package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
  279. package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
  280. package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
  281. package/src/src/platform/compat/process/command.ts +297 -0
  282. package/src/src/platform/compat/process/env.ts +227 -0
  283. package/src/src/platform/compat/process/lifecycle.ts +330 -0
  284. package/src/src/platform/compat/process/runtime-process.ts +27 -0
  285. package/src/src/platform/compat/process.ts +37 -870
  286. package/src/src/platform/index.ts +1 -0
  287. package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
  288. package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
  289. package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
  290. package/src/src/provider/runtime-loader.ts +113 -368
  291. package/src/src/proxy/handler.ts +16 -0
  292. package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
  293. package/src/src/rendering/orchestrator/pipeline.ts +8 -35
  294. package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
  295. package/src/src/routing/api/module-loader/loader.ts +8 -65
  296. package/src/src/server/bootstrap.ts +88 -7
  297. package/src/src/server/dev-ui/manifest.js +3 -1
  298. package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
  299. package/src/src/server/production-server.ts +1 -1
  300. package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
  301. package/src/src/server/utils/domain-parser.ts +4 -0
  302. package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
  303. package/src/src/tool/index.ts +1 -0
  304. package/src/src/tool/types.ts +21 -0
  305. package/src/src/utils/version-constant.ts +1 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Extension validate command — check an extension for shape and capability issues.
3
+ *
4
+ * @module cli/commands/extension/validate-command
5
+ */
6
+ import * as dntShim from "../../../_dnt.shims.js";
7
+
8
+
9
+ import { validateExtension } from "../../../src/extensions/validation.js";
10
+
11
+ export interface ValidationReport {
12
+ valid: boolean;
13
+ issues: string[];
14
+ }
15
+
16
+ /**
17
+ * Validate an extension at the given directory path.
18
+ */
19
+ export async function validateExtensionAtPath(
20
+ extensionPath: string,
21
+ ): Promise<ValidationReport> {
22
+ const issues: string[] = [];
23
+
24
+ const candidates = [
25
+ `${extensionPath}/src/index.ts`,
26
+ `${extensionPath}/index.ts`,
27
+ ];
28
+
29
+ let entryPoint: string | undefined;
30
+ for (const candidate of candidates) {
31
+ try {
32
+ const stat = await dntShim.Deno.stat(candidate);
33
+ if (stat.isFile) {
34
+ entryPoint = candidate;
35
+ break;
36
+ }
37
+ } catch { /* next candidate */ }
38
+ }
39
+
40
+ if (!entryPoint) {
41
+ issues.push(`No entry point found. Expected src/index.ts or index.ts in ${extensionPath}`);
42
+ return { valid: false, issues };
43
+ }
44
+
45
+ try {
46
+ const mod = await import(`file://${await dntShim.Deno.realPath(entryPoint)}`);
47
+ const factory = mod.default;
48
+
49
+ if (typeof factory !== "function") {
50
+ issues.push("Default export must be a function (ExtensionFactory).");
51
+ return { valid: false, issues };
52
+ }
53
+
54
+ const ext = factory();
55
+ issues.push(...validateExtension(ext));
56
+ } catch (err) {
57
+ issues.push(`Failed to import extension: ${(err as Error).message}`);
58
+ }
59
+
60
+ return { valid: issues.length === 0, issues };
61
+ }
62
+
63
+ /**
64
+ * CLI entry point for `veryfront extension validate <path>`.
65
+ */
66
+ export async function runExtensionValidate(extensionPath: string): Promise<void> {
67
+ const report = await validateExtensionAtPath(extensionPath);
68
+
69
+ if (report.valid) {
70
+ console.log("Extension is valid.");
71
+ } else {
72
+ console.error("Extension validation failed:");
73
+ for (const issue of report.issues) {
74
+ console.error(` - ${issue}`);
75
+ }
76
+ dntShim.Deno.exit(1);
77
+ }
78
+ }
@@ -0,0 +1,185 @@
1
+ export type TokenAuthMethod =
2
+ | "basic"
3
+ | "body"
4
+ | "client_secret_basic"
5
+ | "client_secret_post"
6
+ | "request_body";
7
+
8
+ export interface IntegrationGeneratorOptionsLike {
9
+ name?: string;
10
+ displayName?: string;
11
+ authType?: "oauth2" | "api-key";
12
+ apiBaseUrl?: string;
13
+ authorizationUrl?: string;
14
+ tokenUrl?: string;
15
+ scopes?: string;
16
+ tokenAuthMethod?: TokenAuthMethod;
17
+ additionalAuthParams?: string;
18
+ usePKCE?: boolean;
19
+ }
20
+
21
+ export interface IntegrationConfig {
22
+ name: string;
23
+ displayName: string;
24
+ authType: "oauth2" | "api-key";
25
+ apiBaseUrl: string;
26
+ authorizationUrl?: string;
27
+ tokenUrl?: string;
28
+ scopes: string[];
29
+ tokenAuthMethod: TokenAuthMethod;
30
+ additionalAuthParams: Record<string, string>;
31
+ usePKCE: boolean;
32
+ envVarPrefix: string;
33
+ }
34
+
35
+ export function parseScopes(scopes?: string): string[] {
36
+ return scopes?.split(",").map((scope) => scope.trim()) || [];
37
+ }
38
+
39
+ export function parseAdditionalAuthParams(params?: string): Record<string, string> {
40
+ if (!params?.trim()) return {};
41
+
42
+ return Object.fromEntries(
43
+ params.split(",")
44
+ .map((entry) => entry.trim())
45
+ .filter(Boolean)
46
+ .map((entry) => {
47
+ const separatorIndex = entry.indexOf("=");
48
+ if (separatorIndex === -1) {
49
+ throw new Error(
50
+ "Additional auth params must use key=value pairs separated by commas",
51
+ );
52
+ }
53
+
54
+ const key = entry.slice(0, separatorIndex).trim();
55
+ const value = entry.slice(separatorIndex + 1).trim();
56
+
57
+ if (!key || !value) {
58
+ throw new Error(
59
+ "Additional auth params must use non-empty key=value pairs",
60
+ );
61
+ }
62
+
63
+ return [key, value];
64
+ }),
65
+ );
66
+ }
67
+
68
+ export function normalizeTokenAuthMethod(method?: string): TokenAuthMethod {
69
+ switch (method?.trim().toLowerCase()) {
70
+ case "basic":
71
+ return "basic";
72
+ case "body":
73
+ return "body";
74
+ case "client_secret_basic":
75
+ return "client_secret_basic";
76
+ case "client_secret_post":
77
+ return "client_secret_post";
78
+ case "request_body":
79
+ case undefined:
80
+ case "":
81
+ return "request_body";
82
+ default:
83
+ throw new Error(
84
+ "OAuth token auth method must be one of: request_body, body, basic, client_secret_basic, client_secret_post",
85
+ );
86
+ }
87
+ }
88
+
89
+ export function parseBooleanOption(
90
+ value: string | boolean | undefined,
91
+ defaultValue = false,
92
+ ): boolean {
93
+ if (typeof value === "boolean") return value;
94
+ if (!value?.trim()) return defaultValue;
95
+
96
+ switch (value.trim().toLowerCase()) {
97
+ case "y":
98
+ case "yes":
99
+ case "true":
100
+ case "1":
101
+ return true;
102
+ case "n":
103
+ case "no":
104
+ case "false":
105
+ case "0":
106
+ return false;
107
+ default:
108
+ throw new Error("Boolean option must be yes/no, true/false, or 1/0");
109
+ }
110
+ }
111
+
112
+ export function validateIntegrationName(name: string): void {
113
+ if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {
114
+ throw new Error("Integration name must be lowercase letters, numbers, and hyphens");
115
+ }
116
+ }
117
+
118
+ export function getNonInteractiveConfig(
119
+ options: IntegrationGeneratorOptionsLike,
120
+ ): IntegrationConfig {
121
+ const { name, displayName, authType } = options;
122
+
123
+ if (!name || !displayName || !authType) {
124
+ throw new Error(
125
+ "Non-interactive mode requires --name, --display-name, and --auth-type options",
126
+ );
127
+ }
128
+
129
+ const normalizedName = name.toLowerCase();
130
+
131
+ return {
132
+ name: normalizedName,
133
+ displayName,
134
+ authType,
135
+ apiBaseUrl: options.apiBaseUrl ?? `https://api.${name}.com`,
136
+ authorizationUrl: options.authorizationUrl,
137
+ tokenUrl: options.tokenUrl,
138
+ scopes: parseScopes(options.scopes),
139
+ tokenAuthMethod: normalizeTokenAuthMethod(options.tokenAuthMethod),
140
+ additionalAuthParams: parseAdditionalAuthParams(options.additionalAuthParams),
141
+ usePKCE: parseBooleanOption(options.usePKCE, false),
142
+ envVarPrefix: name.toUpperCase().replace(/-/g, "_"),
143
+ };
144
+ }
145
+
146
+ const TOOL_FILE_CONTENTS: Record<string, { inputSchema: string; executeBody: string }> = {
147
+ "list-items.ts": {
148
+ inputSchema: `limit: z.number().optional().describe("Maximum number of items to return"),
149
+ offset: z.number().optional().describe("Number of items to skip"),`,
150
+ executeBody: `const items = await listItems({
151
+ limit: input.limit,
152
+ offset: input.offset,
153
+ });
154
+ return {
155
+ success: true,
156
+ items,
157
+ count: items.length,
158
+ };`,
159
+ },
160
+ "get-item.ts": {
161
+ inputSchema: `id: z.string().describe("The ID of the item to retrieve"),`,
162
+ executeBody: `const item = await getItem(input.id);
163
+ return {
164
+ success: true,
165
+ item,
166
+ };`,
167
+ },
168
+ "search.ts": {
169
+ inputSchema: `query: z.string().describe("Search query"),`,
170
+ executeBody: `const results = await searchItems(input.query);
171
+ return {
172
+ success: true,
173
+ results,
174
+ count: results.length,
175
+ };`,
176
+ },
177
+ };
178
+
179
+ export function getToolInputSchema(toolFile: string): string {
180
+ return TOOL_FILE_CONTENTS[toolFile]?.inputSchema ?? "";
181
+ }
182
+
183
+ export function getToolExecuteBody(toolFile: string): string {
184
+ return TOOL_FILE_CONTENTS[toolFile]?.executeBody ?? "";
185
+ }
@@ -12,6 +12,18 @@ import { createFileSystem, type FileSystem } from "../../../src/platform/index.j
12
12
  import { ensureDir } from "../../utils/fs.js";
13
13
  import { isInteractive as checkIsInteractive, promptSync } from "../../../src/platform/index.js";
14
14
  import { isCiEnv, isDenoTestingEnv } from "../../../src/config/index.js";
15
+ import {
16
+ getNonInteractiveConfig,
17
+ getToolExecuteBody,
18
+ getToolInputSchema,
19
+ type IntegrationConfig,
20
+ normalizeTokenAuthMethod,
21
+ parseAdditionalAuthParams,
22
+ parseBooleanOption,
23
+ parseScopes,
24
+ type TokenAuthMethod,
25
+ validateIntegrationName,
26
+ } from "./integration-generator-helpers.js";
15
27
  import { select } from "../../utils/terminal-select.js";
16
28
 
17
29
  let fs: FileSystem;
@@ -41,27 +53,6 @@ export interface IntegrationGeneratorOptions {
41
53
  skipPrompts?: boolean;
42
54
  }
43
55
 
44
- type TokenAuthMethod =
45
- | "basic"
46
- | "body"
47
- | "client_secret_basic"
48
- | "client_secret_post"
49
- | "request_body";
50
-
51
- interface IntegrationConfig {
52
- name: string;
53
- displayName: string;
54
- authType: "oauth2" | "api-key";
55
- apiBaseUrl: string;
56
- authorizationUrl?: string;
57
- tokenUrl?: string;
58
- scopes: string[];
59
- tokenAuthMethod: TokenAuthMethod;
60
- additionalAuthParams: Record<string, string>;
61
- usePKCE: boolean;
62
- envVarPrefix: string;
63
- }
64
-
65
56
  function canRunPrompts(): boolean {
66
57
  return !(isCiEnv() || isDenoTestingEnv()) && checkIsInteractive();
67
58
  }
@@ -73,86 +64,6 @@ function promptText(question: string, defaultValue?: string): Promise<string> {
73
64
  return Promise.resolve(input?.trim() || defaultValue || "");
74
65
  }
75
66
 
76
- function parseScopes(scopes?: string): string[] {
77
- return scopes?.split(",").map((s) => s.trim()) || [];
78
- }
79
-
80
- function parseAdditionalAuthParams(params?: string): Record<string, string> {
81
- if (!params?.trim()) return {};
82
-
83
- return Object.fromEntries(
84
- params.split(",")
85
- .map((entry) => entry.trim())
86
- .filter(Boolean)
87
- .map((entry) => {
88
- const separatorIndex = entry.indexOf("=");
89
- if (separatorIndex === -1) {
90
- throw new Error(
91
- "Additional auth params must use key=value pairs separated by commas",
92
- );
93
- }
94
-
95
- const key = entry.slice(0, separatorIndex).trim();
96
- const value = entry.slice(separatorIndex + 1).trim();
97
-
98
- if (!key || !value) {
99
- throw new Error(
100
- "Additional auth params must use non-empty key=value pairs",
101
- );
102
- }
103
-
104
- return [key, value];
105
- }),
106
- );
107
- }
108
-
109
- function normalizeTokenAuthMethod(method?: string): TokenAuthMethod {
110
- switch (method?.trim().toLowerCase()) {
111
- case "basic":
112
- return "basic";
113
- case "body":
114
- return "body";
115
- case "client_secret_basic":
116
- return "client_secret_basic";
117
- case "client_secret_post":
118
- return "client_secret_post";
119
- case "request_body":
120
- case undefined:
121
- case "":
122
- return "request_body";
123
- default:
124
- throw new Error(
125
- "OAuth token auth method must be one of: request_body, body, basic, client_secret_basic, client_secret_post",
126
- );
127
- }
128
- }
129
-
130
- function parseBooleanOption(value: string | boolean | undefined, defaultValue = false): boolean {
131
- if (typeof value === "boolean") return value;
132
- if (!value?.trim()) return defaultValue;
133
-
134
- switch (value.trim().toLowerCase()) {
135
- case "y":
136
- case "yes":
137
- case "true":
138
- case "1":
139
- return true;
140
- case "n":
141
- case "no":
142
- case "false":
143
- case "0":
144
- return false;
145
- default:
146
- throw new Error("Boolean option must be yes/no, true/false, or 1/0");
147
- }
148
- }
149
-
150
- function validateIntegrationName(name: string): void {
151
- if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {
152
- throw new Error("Integration name must be lowercase letters, numbers, and hyphens");
153
- }
154
- }
155
-
156
67
  export async function generateIntegration(
157
68
  projectDir: string,
158
69
  options: IntegrationGeneratorOptions = {},
@@ -182,32 +93,6 @@ export async function generateIntegration(
182
93
  console.log("");
183
94
  }
184
95
 
185
- function getNonInteractiveConfig(options: IntegrationGeneratorOptions): IntegrationConfig {
186
- const { name, displayName, authType } = options;
187
-
188
- if (!name || !displayName || !authType) {
189
- throw new Error(
190
- "Non-interactive mode requires --name, --display-name, and --auth-type options",
191
- );
192
- }
193
-
194
- const normalizedName = name.toLowerCase();
195
-
196
- return {
197
- name: normalizedName,
198
- displayName,
199
- authType,
200
- apiBaseUrl: options.apiBaseUrl ?? `https://api.${name}.com`,
201
- authorizationUrl: options.authorizationUrl,
202
- tokenUrl: options.tokenUrl,
203
- scopes: parseScopes(options.scopes),
204
- tokenAuthMethod: normalizeTokenAuthMethod(options.tokenAuthMethod),
205
- additionalAuthParams: parseAdditionalAuthParams(options.additionalAuthParams),
206
- usePKCE: parseBooleanOption(options.usePKCE, false),
207
- envVarPrefix: name.toUpperCase().replace(/-/g, "_"),
208
- };
209
- }
210
-
211
96
  async function getInteractiveConfig(
212
97
  options: IntegrationGeneratorOptions,
213
98
  ): Promise<IntegrationConfig> {
@@ -809,47 +694,6 @@ export async function searchItems(query: string): Promise<unknown[]> {
809
694
  cliLogger.debug("Created API client");
810
695
  }
811
696
 
812
- function getToolInputSchema(toolFile: string): string {
813
- return TOOL_FILE_CONTENTS[toolFile]?.inputSchema ?? "";
814
- }
815
-
816
- function getToolExecuteBody(toolFile: string): string {
817
- return TOOL_FILE_CONTENTS[toolFile]?.executeBody ?? "";
818
- }
819
-
820
- const TOOL_FILE_CONTENTS: Record<string, { inputSchema: string; executeBody: string }> = {
821
- "list-items.ts": {
822
- inputSchema: `limit: z.number().optional().describe("Maximum number of items to return"),
823
- offset: z.number().optional().describe("Number of items to skip"),`,
824
- executeBody: `const items = await listItems({
825
- limit: input.limit,
826
- offset: input.offset,
827
- });
828
- return {
829
- success: true,
830
- items,
831
- count: items.length,
832
- };`,
833
- },
834
- "get-item.ts": {
835
- inputSchema: `id: z.string().describe("The ID of the item to retrieve"),`,
836
- executeBody: `const item = await getItem(input.id);
837
- return {
838
- success: true,
839
- item,
840
- };`,
841
- },
842
- "search.ts": {
843
- inputSchema: `query: z.string().describe("Search query"),`,
844
- executeBody: `const results = await searchItems(input.query);
845
- return {
846
- success: true,
847
- results,
848
- count: results.length,
849
- };`,
850
- },
851
- };
852
-
853
697
  async function createToolSkeletons(baseDir: string, config: IntegrationConfig): Promise<void> {
854
698
  const tools = [
855
699
  {