alchemy 0.62.2 → 0.63.0

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 (611) hide show
  1. package/bin/alchemy.js +1518 -1204
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +7 -3
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +6 -4
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/vite/vite.d.ts +1 -1
  163. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  164. package/lib/cloudflare/vite/vite.js +1 -1
  165. package/lib/cloudflare/vite/vite.js.map +1 -1
  166. package/lib/cloudflare/website.js +1 -1
  167. package/lib/cloudflare/website.js.map +1 -1
  168. package/lib/cloudflare/worker.d.ts +1 -1
  169. package/lib/cloudflare/worker.d.ts.map +1 -1
  170. package/lib/cloudflare/worker.js +12 -7
  171. package/lib/cloudflare/worker.js.map +1 -1
  172. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  173. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  174. package/lib/cloudflare/wrangler.json.js +5 -3
  175. package/lib/cloudflare/wrangler.json.js.map +1 -1
  176. package/lib/docker/container.d.ts +6 -0
  177. package/lib/docker/container.d.ts.map +1 -1
  178. package/lib/docker/container.js +5 -1
  179. package/lib/docker/container.js.map +1 -1
  180. package/lib/docker/network.d.ts +8 -2
  181. package/lib/docker/network.d.ts.map +1 -1
  182. package/lib/docker/network.js +7 -2
  183. package/lib/docker/network.js.map +1 -1
  184. package/lib/docker/volume.d.ts +8 -2
  185. package/lib/docker/volume.d.ts.map +1 -1
  186. package/lib/docker/volume.js +6 -4
  187. package/lib/docker/volume.js.map +1 -1
  188. package/lib/esbuild/bundle.d.ts +1 -1
  189. package/lib/fs/index.d.ts +0 -8
  190. package/lib/fs/index.d.ts.map +1 -1
  191. package/lib/fs/index.js +0 -8
  192. package/lib/fs/index.js.map +1 -1
  193. package/lib/github/client.d.ts +1 -1
  194. package/lib/github/client.d.ts.map +1 -1
  195. package/lib/github/client.js +2 -1
  196. package/lib/github/client.js.map +1 -1
  197. package/lib/github/repository-environment.d.ts +8 -2
  198. package/lib/github/repository-environment.d.ts.map +1 -1
  199. package/lib/github/repository-environment.js +16 -12
  200. package/lib/github/repository-environment.js.map +1 -1
  201. package/lib/neon/project.d.ts +7 -1
  202. package/lib/neon/project.d.ts.map +1 -1
  203. package/lib/neon/project.js +10 -6
  204. package/lib/neon/project.js.map +1 -1
  205. package/lib/planetscale/branch.d.ts +4 -2
  206. package/lib/planetscale/branch.d.ts.map +1 -1
  207. package/lib/planetscale/branch.js +18 -12
  208. package/lib/planetscale/branch.js.map +1 -1
  209. package/lib/planetscale/database.d.ts +8 -2
  210. package/lib/planetscale/database.d.ts.map +1 -1
  211. package/lib/planetscale/database.js +24 -16
  212. package/lib/planetscale/database.js.map +1 -1
  213. package/lib/planetscale/password.d.ts +8 -2
  214. package/lib/planetscale/password.d.ts.map +1 -1
  215. package/lib/planetscale/password.js +2 -2
  216. package/lib/planetscale/password.js.map +1 -1
  217. package/lib/resource.d.ts +0 -2
  218. package/lib/resource.d.ts.map +1 -1
  219. package/lib/resource.js +1 -9
  220. package/lib/resource.js.map +1 -1
  221. package/lib/scope.d.ts +9 -3
  222. package/lib/scope.d.ts.map +1 -1
  223. package/lib/scope.js +21 -34
  224. package/lib/scope.js.map +1 -1
  225. package/lib/sentry/client-key.d.ts +7 -1
  226. package/lib/sentry/client-key.d.ts.map +1 -1
  227. package/lib/sentry/client-key.js +45 -6
  228. package/lib/sentry/client-key.js.map +1 -1
  229. package/lib/sentry/project.d.ts +8 -2
  230. package/lib/sentry/project.d.ts.map +1 -1
  231. package/lib/sentry/project.js +35 -5
  232. package/lib/sentry/project.js.map +1 -1
  233. package/lib/sentry/team.d.ts +8 -2
  234. package/lib/sentry/team.d.ts.map +1 -1
  235. package/lib/sentry/team.js +36 -6
  236. package/lib/sentry/team.js.map +1 -1
  237. package/lib/serde.d.ts +0 -5
  238. package/lib/serde.d.ts.map +1 -1
  239. package/lib/serde.js +0 -28
  240. package/lib/serde.js.map +1 -1
  241. package/lib/state/d1-state-store.d.ts +1 -1
  242. package/lib/state/d1-state-store.d.ts.map +1 -1
  243. package/lib/state/d1-state-store.js +5 -5
  244. package/lib/state/d1-state-store.js.map +1 -1
  245. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  246. package/lib/state/sqlite-state-store.js +7 -11
  247. package/lib/state/sqlite-state-store.js.map +1 -1
  248. package/lib/stripe/card.d.ts.map +1 -1
  249. package/lib/stripe/card.js +3 -2
  250. package/lib/stripe/card.js.map +1 -1
  251. package/lib/stripe/client.d.ts +2 -2
  252. package/lib/stripe/client.d.ts.map +1 -1
  253. package/lib/stripe/client.js +4 -3
  254. package/lib/stripe/client.js.map +1 -1
  255. package/lib/stripe/coupon.d.ts.map +1 -1
  256. package/lib/stripe/coupon.js +4 -3
  257. package/lib/stripe/coupon.js.map +1 -1
  258. package/lib/stripe/customer.js +2 -2
  259. package/lib/stripe/customer.js.map +1 -1
  260. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  261. package/lib/stripe/entitlements-feature.js +3 -2
  262. package/lib/stripe/entitlements-feature.js.map +1 -1
  263. package/lib/stripe/file.d.ts.map +1 -1
  264. package/lib/stripe/file.js +3 -2
  265. package/lib/stripe/file.js.map +1 -1
  266. package/lib/stripe/meter.js +2 -2
  267. package/lib/stripe/meter.js.map +1 -1
  268. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  269. package/lib/stripe/portal-configuration.js +3 -2
  270. package/lib/stripe/portal-configuration.js.map +1 -1
  271. package/lib/stripe/price.d.ts.map +1 -1
  272. package/lib/stripe/price.js +3 -2
  273. package/lib/stripe/price.js.map +1 -1
  274. package/lib/stripe/product-feature.d.ts.map +1 -1
  275. package/lib/stripe/product-feature.js +3 -2
  276. package/lib/stripe/product-feature.js.map +1 -1
  277. package/lib/stripe/product.d.ts.map +1 -1
  278. package/lib/stripe/product.js +3 -2
  279. package/lib/stripe/product.js.map +1 -1
  280. package/lib/stripe/promotion-code.d.ts.map +1 -1
  281. package/lib/stripe/promotion-code.js +3 -2
  282. package/lib/stripe/promotion-code.js.map +1 -1
  283. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  284. package/lib/stripe/shipping-rate.js +4 -3
  285. package/lib/stripe/shipping-rate.js.map +1 -1
  286. package/lib/stripe/tax-rate.d.ts.map +1 -1
  287. package/lib/stripe/tax-rate.js +3 -2
  288. package/lib/stripe/tax-rate.js.map +1 -1
  289. package/lib/stripe/webhook.d.ts.map +1 -1
  290. package/lib/stripe/webhook.js +4 -3
  291. package/lib/stripe/webhook.js.map +1 -1
  292. package/lib/test/vitest.d.ts.map +1 -1
  293. package/lib/test/vitest.js +1 -0
  294. package/lib/test/vitest.js.map +1 -1
  295. package/lib/upstash/redis.d.ts +8 -2
  296. package/lib/upstash/redis.d.ts.map +1 -1
  297. package/lib/upstash/redis.js +5 -4
  298. package/lib/upstash/redis.js.map +1 -1
  299. package/lib/util/ignore-matcher.d.ts.map +1 -1
  300. package/lib/util/ignore-matcher.js +3 -1
  301. package/lib/util/ignore-matcher.js.map +1 -1
  302. package/lib/util/peer.d.ts +10 -0
  303. package/lib/util/peer.d.ts.map +1 -0
  304. package/lib/util/peer.js +42 -0
  305. package/lib/util/peer.js.map +1 -0
  306. package/lib/util/telemetry/constants.d.ts.map +1 -1
  307. package/lib/util/telemetry/constants.js +2 -2
  308. package/lib/util/telemetry/constants.js.map +1 -1
  309. package/lib/vercel/project.d.ts +7 -1
  310. package/lib/vercel/project.d.ts.map +1 -1
  311. package/lib/vercel/project.js +28 -0
  312. package/lib/vercel/project.js.map +1 -1
  313. package/package.json +88 -74
  314. package/src/alchemy.ts +76 -222
  315. package/src/apply.ts +6 -19
  316. package/src/aws/account-id.ts +6 -3
  317. package/src/aws/bucket.ts +43 -32
  318. package/src/aws/ec2/security-group.ts +15 -3
  319. package/src/aws/function.ts +65 -39
  320. package/src/aws/policy-attachment.ts +10 -6
  321. package/src/aws/policy.ts +33 -15
  322. package/src/aws/queue.ts +50 -29
  323. package/src/aws/role.ts +37 -20
  324. package/src/aws/ses.ts +24 -20
  325. package/src/aws/ssm-parameter.ts +40 -20
  326. package/src/aws/table.ts +35 -17
  327. package/src/cloudflare/account-api-token.ts +9 -7
  328. package/src/cloudflare/ai-gateway.ts +37 -34
  329. package/src/cloudflare/api-schema.ts +33 -26
  330. package/src/cloudflare/api-shield.ts +15 -2
  331. package/src/cloudflare/astro/astro.ts +5 -1
  332. package/src/cloudflare/astro/plugin.ts +2 -1
  333. package/src/cloudflare/bindings.ts +2 -2
  334. package/src/cloudflare/bound.ts +1 -1
  335. package/src/cloudflare/bucket.ts +242 -3
  336. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  337. package/src/cloudflare/container.ts +23 -12
  338. package/src/cloudflare/custom-domain.ts +2 -2
  339. package/src/cloudflare/d1-database.ts +11 -4
  340. package/src/cloudflare/dispatch-namespace.ts +10 -7
  341. package/src/cloudflare/hyperdrive.ts +13 -3
  342. package/src/cloudflare/kv-namespace.ts +25 -2
  343. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  344. package/src/cloudflare/miniflare/paths.ts +13 -0
  345. package/src/cloudflare/pipeline.ts +76 -28
  346. package/src/cloudflare/queue-consumer.ts +1 -1
  347. package/src/cloudflare/queue.ts +65 -54
  348. package/src/cloudflare/react-router/react-router.ts +28 -2
  349. package/src/cloudflare/redwood/plugin.ts +3 -2
  350. package/src/cloudflare/route.ts +1 -1
  351. package/src/cloudflare/ruleset.ts +7 -2
  352. package/src/cloudflare/secret.ts +20 -31
  353. package/src/cloudflare/secrets-store.ts +7 -3
  354. package/src/cloudflare/tunnel.ts +13 -2
  355. package/src/cloudflare/vectorize-index.ts +14 -3
  356. package/src/cloudflare/vite/plugin.ts +3 -2
  357. package/src/cloudflare/vite/vite.ts +2 -3
  358. package/src/cloudflare/website.ts +1 -1
  359. package/src/cloudflare/worker.ts +35 -23
  360. package/src/cloudflare/wrangler.json.ts +7 -4
  361. package/src/docker/container.ts +13 -1
  362. package/src/docker/network.ts +18 -3
  363. package/src/docker/volume.ts +17 -6
  364. package/src/fs/index.ts +0 -8
  365. package/src/github/client.ts +6 -2
  366. package/src/github/repository-environment.ts +27 -13
  367. package/src/neon/project.ts +20 -6
  368. package/src/planetscale/branch.ts +24 -13
  369. package/src/planetscale/database.ts +38 -17
  370. package/src/planetscale/password.ts +10 -3
  371. package/src/resource.ts +1 -10
  372. package/src/scope.ts +29 -38
  373. package/src/sentry/client-key.ts +74 -6
  374. package/src/sentry/project.ts +59 -6
  375. package/src/sentry/team.ts +55 -7
  376. package/src/serde.ts +0 -44
  377. package/src/state/d1-state-store.ts +13 -6
  378. package/src/state/sqlite-state-store.ts +16 -17
  379. package/src/stripe/card.ts +5 -2
  380. package/src/stripe/client.ts +10 -3
  381. package/src/stripe/coupon.ts +4 -3
  382. package/src/stripe/customer.ts +2 -2
  383. package/src/stripe/entitlements-feature.ts +5 -2
  384. package/src/stripe/file.ts +3 -2
  385. package/src/stripe/meter.ts +2 -2
  386. package/src/stripe/portal-configuration.ts +5 -2
  387. package/src/stripe/price.ts +3 -2
  388. package/src/stripe/product-feature.ts +5 -2
  389. package/src/stripe/product.ts +3 -2
  390. package/src/stripe/promotion-code.ts +3 -2
  391. package/src/stripe/shipping-rate.ts +4 -3
  392. package/src/stripe/tax-rate.ts +3 -2
  393. package/src/stripe/webhook.ts +4 -3
  394. package/src/test/vitest.ts +1 -0
  395. package/src/upstash/redis.ts +15 -5
  396. package/src/util/ignore-matcher.ts +3 -1
  397. package/src/util/peer.ts +53 -0
  398. package/src/util/telemetry/constants.ts +2 -2
  399. package/src/vercel/project.ts +46 -1
  400. package/templates/astro/_gitignore +2 -1
  401. package/templates/hono/README.md +19 -0
  402. package/templates/hono/_env +1 -0
  403. package/templates/hono/_env.example +1 -0
  404. package/templates/hono/_gitignore +34 -0
  405. package/templates/hono/alchemy.run.ts +22 -0
  406. package/templates/hono/package.json +18 -0
  407. package/templates/hono/src/index.ts +17 -0
  408. package/templates/hono/tsconfig.json +13 -0
  409. package/templates/hono/types/env.d.ts +16 -0
  410. package/templates/nuxt/_gitignore +2 -1
  411. package/templates/react-router/_gitignore +1 -0
  412. package/templates/react-router/vite.config.ts +5 -3
  413. package/templates/rwsdk/_gitignore +2 -3
  414. package/templates/sveltekit/_gitignore +2 -1
  415. package/templates/tanstack-start/_gitignore +2 -1
  416. package/templates/typescript/_gitignore +2 -1
  417. package/templates/vite/_gitignore +2 -1
  418. package/workers/cloudflare-state-store.js +69 -74
  419. package/workers/dofs-state-store.js +1 -1
  420. package/bin/bootstrap-s3.ts +0 -255
  421. package/lib/ai/ark.d.ts +0 -12
  422. package/lib/ai/ark.d.ts.map +0 -1
  423. package/lib/ai/ark.js +0 -87
  424. package/lib/ai/ark.js.map +0 -1
  425. package/lib/ai/astro-file.d.ts +0 -138
  426. package/lib/ai/astro-file.d.ts.map +0 -1
  427. package/lib/ai/astro-file.js +0 -158
  428. package/lib/ai/astro-file.js.map +0 -1
  429. package/lib/ai/client.d.ts +0 -51
  430. package/lib/ai/client.d.ts.map +0 -1
  431. package/lib/ai/client.js +0 -58
  432. package/lib/ai/client.js.map +0 -1
  433. package/lib/ai/css-file.d.ts +0 -132
  434. package/lib/ai/css-file.d.ts.map +0 -1
  435. package/lib/ai/css-file.js +0 -142
  436. package/lib/ai/css-file.js.map +0 -1
  437. package/lib/ai/data.d.ts +0 -152
  438. package/lib/ai/data.d.ts.map +0 -1
  439. package/lib/ai/data.js +0 -120
  440. package/lib/ai/data.js.map +0 -1
  441. package/lib/ai/document.d.ts +0 -208
  442. package/lib/ai/document.d.ts.map +0 -1
  443. package/lib/ai/document.js +0 -206
  444. package/lib/ai/document.js.map +0 -1
  445. package/lib/ai/html-file.d.ts +0 -129
  446. package/lib/ai/html-file.d.ts.map +0 -1
  447. package/lib/ai/html-file.js +0 -139
  448. package/lib/ai/html-file.js.map +0 -1
  449. package/lib/ai/index.d.ts +0 -11
  450. package/lib/ai/index.d.ts.map +0 -1
  451. package/lib/ai/index.js +0 -11
  452. package/lib/ai/index.js.map +0 -1
  453. package/lib/ai/json-file.d.ts +0 -161
  454. package/lib/ai/json-file.d.ts.map +0 -1
  455. package/lib/ai/json-file.js +0 -188
  456. package/lib/ai/json-file.js.map +0 -1
  457. package/lib/ai/typescript-file.d.ts +0 -140
  458. package/lib/ai/typescript-file.d.ts.map +0 -1
  459. package/lib/ai/typescript-file.js +0 -146
  460. package/lib/ai/typescript-file.js.map +0 -1
  461. package/lib/ai/vue-file.d.ts +0 -127
  462. package/lib/ai/vue-file.d.ts.map +0 -1
  463. package/lib/ai/vue-file.js +0 -137
  464. package/lib/ai/vue-file.js.map +0 -1
  465. package/lib/ai/yaml-file.d.ts +0 -170
  466. package/lib/ai/yaml-file.d.ts.map +0 -1
  467. package/lib/ai/yaml-file.js +0 -201
  468. package/lib/ai/yaml-file.js.map +0 -1
  469. package/lib/fs/static-astro-file.d.ts +0 -35
  470. package/lib/fs/static-astro-file.d.ts.map +0 -1
  471. package/lib/fs/static-astro-file.js +0 -40
  472. package/lib/fs/static-astro-file.js.map +0 -1
  473. package/lib/fs/static-css-file.d.ts +0 -25
  474. package/lib/fs/static-css-file.d.ts.map +0 -1
  475. package/lib/fs/static-css-file.js +0 -30
  476. package/lib/fs/static-css-file.js.map +0 -1
  477. package/lib/fs/static-html-file.d.ts +0 -32
  478. package/lib/fs/static-html-file.d.ts.map +0 -1
  479. package/lib/fs/static-html-file.js +0 -37
  480. package/lib/fs/static-html-file.js.map +0 -1
  481. package/lib/fs/static-json-file.d.ts +0 -18
  482. package/lib/fs/static-json-file.d.ts.map +0 -1
  483. package/lib/fs/static-json-file.js +0 -19
  484. package/lib/fs/static-json-file.js.map +0 -1
  485. package/lib/fs/static-text-file.d.ts +0 -13
  486. package/lib/fs/static-text-file.d.ts.map +0 -1
  487. package/lib/fs/static-text-file.js +0 -9
  488. package/lib/fs/static-text-file.js.map +0 -1
  489. package/lib/fs/static-typescript-file.d.ts +0 -20
  490. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  491. package/lib/fs/static-typescript-file.js +0 -16
  492. package/lib/fs/static-typescript-file.js.map +0 -1
  493. package/lib/fs/static-vue-file.d.ts +0 -29
  494. package/lib/fs/static-vue-file.d.ts.map +0 -1
  495. package/lib/fs/static-vue-file.js +0 -34
  496. package/lib/fs/static-vue-file.js.map +0 -1
  497. package/lib/fs/static-yaml-file.d.ts +0 -23
  498. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  499. package/lib/fs/static-yaml-file.js +0 -10
  500. package/lib/fs/static-yaml-file.js.map +0 -1
  501. package/lib/internal/docs/providers.d.ts +0 -34
  502. package/lib/internal/docs/providers.d.ts.map +0 -1
  503. package/lib/internal/docs/providers.js +0 -200
  504. package/lib/internal/docs/providers.js.map +0 -1
  505. package/lib/runtime/bind.d.ts +0 -25
  506. package/lib/runtime/bind.d.ts.map +0 -1
  507. package/lib/runtime/bind.js +0 -76
  508. package/lib/runtime/bind.js.map +0 -1
  509. package/lib/runtime/global.d.ts +0 -8
  510. package/lib/runtime/global.d.ts.map +0 -1
  511. package/lib/runtime/global.js +0 -3
  512. package/lib/runtime/global.js.map +0 -1
  513. package/lib/runtime/plugin.d.ts +0 -35
  514. package/lib/runtime/plugin.d.ts.map +0 -1
  515. package/lib/runtime/plugin.js +0 -134
  516. package/lib/runtime/plugin.js.map +0 -1
  517. package/lib/runtime/shims.d.ts +0 -6
  518. package/lib/runtime/shims.d.ts.map +0 -1
  519. package/lib/runtime/shims.js +0 -27
  520. package/lib/runtime/shims.js.map +0 -1
  521. package/lib/runtime/state.d.ts +0 -5
  522. package/lib/runtime/state.d.ts.map +0 -1
  523. package/lib/runtime/state.js +0 -4
  524. package/lib/runtime/state.js.map +0 -1
  525. package/lib/web/astro.d.ts +0 -148
  526. package/lib/web/astro.d.ts.map +0 -1
  527. package/lib/web/astro.js +0 -419
  528. package/lib/web/astro.js.map +0 -1
  529. package/lib/web/shadcn-component.d.ts +0 -30
  530. package/lib/web/shadcn-component.d.ts.map +0 -1
  531. package/lib/web/shadcn-component.js +0 -25
  532. package/lib/web/shadcn-component.js.map +0 -1
  533. package/lib/web/shadcn.d.ts +0 -98
  534. package/lib/web/shadcn.d.ts.map +0 -1
  535. package/lib/web/shadcn.js +0 -102
  536. package/lib/web/shadcn.js.map +0 -1
  537. package/lib/web/tailwind.d.ts +0 -65
  538. package/lib/web/tailwind.d.ts.map +0 -1
  539. package/lib/web/tailwind.js +0 -98
  540. package/lib/web/tailwind.js.map +0 -1
  541. package/lib/web/vite.d.ts +0 -96
  542. package/lib/web/vite.d.ts.map +0 -1
  543. package/lib/web/vite.js +0 -232
  544. package/lib/web/vite.js.map +0 -1
  545. package/lib/web/vitepress/config.d.ts +0 -12
  546. package/lib/web/vitepress/config.d.ts.map +0 -1
  547. package/lib/web/vitepress/config.js +0 -33
  548. package/lib/web/vitepress/config.js.map +0 -1
  549. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  550. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  551. package/lib/web/vitepress/custom-theme.js +0 -337
  552. package/lib/web/vitepress/custom-theme.js.map +0 -1
  553. package/lib/web/vitepress/dependencies.d.ts +0 -13
  554. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  555. package/lib/web/vitepress/dependencies.js +0 -37
  556. package/lib/web/vitepress/dependencies.js.map +0 -1
  557. package/lib/web/vitepress/home-page.d.ts +0 -247
  558. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  559. package/lib/web/vitepress/home-page.js +0 -146
  560. package/lib/web/vitepress/home-page.js.map +0 -1
  561. package/lib/web/vitepress/index.d.ts +0 -6
  562. package/lib/web/vitepress/index.d.ts.map +0 -1
  563. package/lib/web/vitepress/index.js +0 -6
  564. package/lib/web/vitepress/index.js.map +0 -1
  565. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  566. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  567. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  568. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  569. package/lib/web/vitepress/vitepress.d.ts +0 -75
  570. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  571. package/lib/web/vitepress/vitepress.js +0 -254
  572. package/lib/web/vitepress/vitepress.js.map +0 -1
  573. package/src/ai/ark.ts +0 -118
  574. package/src/ai/astro-file.ts +0 -270
  575. package/src/ai/client.ts +0 -117
  576. package/src/ai/css-file.ts +0 -247
  577. package/src/ai/data.ts +0 -221
  578. package/src/ai/document.ts +0 -367
  579. package/src/ai/html-file.ts +0 -244
  580. package/src/ai/index.ts +0 -10
  581. package/src/ai/json-file.ts +0 -325
  582. package/src/ai/typescript-file.ts +0 -259
  583. package/src/ai/vue-file.ts +0 -242
  584. package/src/ai/yaml-file.ts +0 -328
  585. package/src/fs/static-astro-file.ts +0 -45
  586. package/src/fs/static-css-file.ts +0 -35
  587. package/src/fs/static-html-file.ts +0 -42
  588. package/src/fs/static-json-file.ts +0 -38
  589. package/src/fs/static-text-file.ts +0 -23
  590. package/src/fs/static-typescript-file.ts +0 -37
  591. package/src/fs/static-vue-file.ts +0 -39
  592. package/src/fs/static-yaml-file.ts +0 -33
  593. package/src/internal/docs/providers.ts +0 -286
  594. package/src/runtime/bind.ts +0 -95
  595. package/src/runtime/global.ts +0 -10
  596. package/src/runtime/plugin.ts +0 -163
  597. package/src/runtime/shims.js +0 -34
  598. package/src/runtime/state.ts +0 -9
  599. package/src/web/astro.ts +0 -643
  600. package/src/web/shadcn-component.ts +0 -72
  601. package/src/web/shadcn.ts +0 -221
  602. package/src/web/tailwind.ts +0 -167
  603. package/src/web/vite.ts +0 -407
  604. package/src/web/vitepress/config.ts +0 -50
  605. package/src/web/vitepress/custom-theme.ts +0 -514
  606. package/src/web/vitepress/dependencies.ts +0 -69
  607. package/src/web/vitepress/home-page.ts +0 -378
  608. package/src/web/vitepress/index.ts +0 -5
  609. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  610. package/src/web/vitepress/vitepress.ts +0 -372
  611. package/templates/sveltekit/bun.lock +0 -1099
@@ -1,367 +0,0 @@
1
- import { generateText, type CoreMessage } from "ai";
2
- import type { Context } from "../context.ts";
3
- import { StaticTextFile } from "../fs/static-text-file.ts";
4
- import { Resource } from "../resource.ts";
5
- import type { Secret } from "../secret.ts";
6
- import { createModel, withRateLimitRetry, type ModelConfig } from "./client.ts";
7
-
8
- /**
9
- * Properties for creating or updating a Document
10
- */
11
- export interface DocumentProps {
12
- /**
13
- * Title of the document
14
- *
15
- * @default id
16
- */
17
- title?: string;
18
-
19
- /**
20
- * Optional path to the markdown document
21
- * If provided, document will be written to this path
22
- */
23
- path?: string;
24
-
25
- /**
26
- * Base URL for the OpenAI API
27
- * @default 'https://api.openai.com/v1'
28
- */
29
- baseURL?: string;
30
-
31
- /**
32
- * Prompt for generating content
33
- * Use alchemy template literals to include file context:
34
- * @example
35
- * prompt: await alchemy`
36
- * Generate docs using:
37
- * ${alchemy.file("src/api.ts")}
38
- * `
39
- */
40
- prompt?: string;
41
-
42
- /**
43
- * Message history for conversation-based generation
44
- * If provided, this will be used instead of the prompt
45
- * @example
46
- * messages: [
47
- * { role: "user", content: "Generate API documentation for this file" },
48
- * { role: "assistant", content: "I'll create detailed API docs. What file should I document?" },
49
- * { role: "user", content: "Please document src/api.ts" }
50
- * ]
51
- */
52
- messages?: CoreMessage[];
53
-
54
- /**
55
- * System prompt for the model
56
- * This is used to provide instructions to the model about how to format the response
57
- * The default system prompt instructs the model to return a single markdown document inside ```md fences
58
- * @default "You are a technical documentation writer. Create a single markdown document based on the user's requirements. Your response MUST include only a single markdown document inside ```md fences. Do not include any other text, explanations, or multiple code blocks."
59
- */
60
- system?: string;
61
-
62
- /**
63
- * OpenAI API key to use for generating content
64
- * If not provided, will use OPENAI_API_KEY environment variable
65
- */
66
- apiKey?: Secret;
67
-
68
- /**
69
- * Model configuration
70
- */
71
- model?: ModelConfig;
72
-
73
- /**
74
- * Temperature for controlling randomness in generation.
75
- * Higher values (e.g., 0.8) make output more random,
76
- * lower values (e.g., 0.2) make it more deterministic.
77
- * @default 0.7
78
- */
79
- temperature?: number;
80
-
81
- /**
82
- * Maximum number of tokens to generate.
83
- * Higher values allow for longer documents but may increase cost and generation time.
84
- * @default 10000
85
- */
86
- maxTokens?: number;
87
-
88
- /**
89
- * Freeze the document after creation (do not re-generate on updates)
90
- * @default false
91
- */
92
- freeze?: boolean;
93
- }
94
-
95
- /**
96
- * A markdown document that can be created, updated, and deleted
97
- */
98
- export interface Document extends DocumentProps, Resource<"docs::Document"> {
99
- /**
100
- * The title of the document
101
- */
102
- title: string;
103
-
104
- /**
105
- * Content of the document
106
- */
107
- content: string;
108
-
109
- /**
110
- * Updated message history with the document response appended
111
- */
112
- messages: CoreMessage[];
113
-
114
- /**
115
- * Time at which the document was created
116
- */
117
- createdAt: number;
118
-
119
- /**
120
- * Time at which the document was last updated
121
- */
122
- updatedAt: number;
123
-
124
- /**
125
- * File resource if path was provided
126
- */
127
- file?: StaticTextFile;
128
- }
129
-
130
- /**
131
- * Default system prompt for markdown document generation
132
- */
133
- const DEFAULT_MD_SYSTEM_PROMPT =
134
- "You are a technical documentation writer. Create a single markdown document based on the user's requirements. Your response MUST include only a single markdown document inside ```md fences. Do not include any other text, explanations, or multiple code blocks.";
135
-
136
- /**
137
- * Resource for managing AI-generated markdown documents using the Vercel AI SDK.
138
- * Supports powerful context handling through the alchemy template literal tag.
139
- *
140
- * @example
141
- * // Create an in-memory document (no file created)
142
- * const apiDocs = await Document("api-docs", {
143
- * title: "API Documentation",
144
- * prompt: await alchemy`
145
- * Generate API documentation based on these source files:
146
- * ${alchemy.file("src/api.ts")}
147
- * ${alchemy.file("src/types.ts")}
148
- * `,
149
- * model: {
150
- * id: "gpt-4o",
151
- * provider: "openai"
152
- * }
153
- * });
154
- *
155
- * @example
156
- * // Create a document and write it to disk
157
- * const apiDocs = await Document("api-docs", {
158
- * title: "API Documentation",
159
- * path: "./docs/api.md",
160
- * prompt: await alchemy`
161
- * Generate API documentation based on these source files:
162
- * ${alchemy.file("src/api.ts")}
163
- * ${alchemy.file("src/types.ts")}
164
- * `,
165
- * model: {
166
- * id: "gpt-4o",
167
- * provider: "openai"
168
- * }
169
- * });
170
- *
171
- * @example
172
- * // Use message history for iterative document generation
173
- * const apiDocs = await Document("api-docs", {
174
- * title: "API Documentation",
175
- * path: "./docs/api.md",
176
- * messages: [
177
- * { role: "user", content: "Create API documentation for these files" },
178
- * { role: "assistant", content: "I'll help you create API documentation. Please provide the files." },
179
- * { role: "user", content: "Here are the files: [file contents]" }
180
- * ],
181
- * system: "You are a technical documentation writer. Generate clear and concise API documentation.",
182
- * model: {
183
- * id: "gpt-4o",
184
- * provider: "openai"
185
- * }
186
- * });
187
- *
188
- * @example
189
- * // Use alchemy template literals with file collections and temperature control
190
- * const modelDocs = await Document("models", {
191
- * title: "Data Models",
192
- * path: "./docs/models.md",
193
- * prompt: await alchemy`
194
- * Write documentation for these data models:
195
- * ${alchemy.files("src/models/user.ts", "src/models/post.ts")}
196
- * `,
197
- * temperature: 0.2 // Lower temperature for more deterministic output
198
- * });
199
- *
200
- * @example
201
- * // Advanced model configuration with custom provider options and custom system prompt
202
- * const techDocs = await Document("tech-specs", {
203
- * title: "Technical Specifications",
204
- * path: "./docs/tech-specs.md",
205
- * prompt: await alchemy`
206
- * Create detailed technical specifications based on these requirements:
207
- * ${alchemy.file("requirements/system.md")}
208
- * `,
209
- * system: "You are an expert technical writer specializing in system specifications. Create a single markdown document inside ```md fences with no additional text.",
210
- * model: {
211
- * id: "o3-mini",
212
- * provider: "openai",
213
- * options: {
214
- * reasoningEffort: "high"
215
- * }
216
- * },
217
- * temperature: 0.1
218
- * });
219
- */
220
- export const Document = Resource(
221
- "docs::Document",
222
- async function (
223
- this: Context<Document>,
224
- id: string,
225
- props: DocumentProps,
226
- ): Promise<Document> {
227
- // Validate that either prompt or messages are provided
228
- if (!props.prompt && !props.messages) {
229
- throw new Error("Either prompt or messages must be provided");
230
- }
231
-
232
- // Handle deletion phase
233
- if (this.phase === "delete") {
234
- return this.destroy();
235
- }
236
-
237
- if (this.phase === "update" && props.freeze) {
238
- if (props.path) {
239
- const filePath = props.path;
240
- const fileId = `${id}-file`;
241
-
242
- await StaticTextFile(fileId, filePath, this.output!.content);
243
- }
244
- return this(this.output);
245
- }
246
-
247
- // Use provided system prompt or default
248
- const system = props.system || DEFAULT_MD_SYSTEM_PROMPT;
249
-
250
- // Generate initial content with rate limit retry
251
- const { text } = await withRateLimitRetry(async () => {
252
- return generateText({
253
- model: createModel(props),
254
- ...(props.messages
255
- ? { messages: props.messages }
256
- : { prompt: props.prompt! }),
257
- system,
258
- maxTokens: props.maxTokens || 8192,
259
- providerOptions: props.model?.options,
260
- ...(props.temperature === undefined
261
- ? {}
262
- : // some models error if you provide it (rather than ignoring it)
263
- { temperature: props.temperature }),
264
- });
265
- });
266
-
267
- // Extract and validate markdown content
268
- let { content, error } = extractMarkdownContent(text);
269
-
270
- // Re-prompt if there are validation errors
271
- if (error) {
272
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one markdown document inside \`\`\`md fences.`;
273
-
274
- const { text: retryText } = await withRateLimitRetry(async () => {
275
- return generateText({
276
- model: createModel(props),
277
- ...(props.messages
278
- ? { messages: props.messages }
279
- : { prompt: props.prompt! }),
280
- system: errorSystem,
281
- providerOptions: props.model?.options,
282
- ...(props.temperature === undefined
283
- ? {}
284
- : { temperature: props.temperature }),
285
- });
286
- });
287
-
288
- const retryResult = extractMarkdownContent(retryText);
289
-
290
- if (retryResult.error) {
291
- throw new Error(
292
- `Failed to generate valid markdown content: ${retryResult.error}\n${retryText}`,
293
- );
294
- }
295
-
296
- content = retryResult.content;
297
- }
298
-
299
- // Create result object
300
- const result: Partial<Document> = {
301
- ...props,
302
- content,
303
- messages: [
304
- ...(props.messages || [{ role: "user", content: props.prompt! }]),
305
- { role: "assistant", content },
306
- ],
307
- createdAt: this.output?.createdAt || Date.now(),
308
- updatedAt: Date.now(),
309
- title: props.title || id,
310
- };
311
-
312
- // Write file if path is provided
313
- if (props.path) {
314
- const filePath = props.path;
315
- const fileId = `${id}-file`;
316
-
317
- result.file = await StaticTextFile(fileId, filePath, content);
318
- }
319
-
320
- // Return the resource
321
- return this(result as Document);
322
- },
323
- );
324
-
325
- /**
326
- * Extracts markdown content from between ```md fences
327
- * Validates that exactly one markdown code block exists
328
- *
329
- * @param text The text to extract markdown content from
330
- * @returns The extracted markdown content or error message
331
- */
332
- export function extractMarkdownContent(text: string): {
333
- content: string;
334
- error?: string;
335
- } {
336
- const lines = text.split("\n");
337
- const startIdx = lines.findIndex((line) => line.trim() === "```md");
338
-
339
- if (startIdx === -1) {
340
- return {
341
- content: "",
342
- error:
343
- "No markdown code block found in the response. Please include your markdown content within ```md fences.",
344
- };
345
- }
346
-
347
- const rest = lines.slice(startIdx + 1);
348
- const endRelativeIdx = rest
349
- .map((line) => line.trim() === "```")
350
- .lastIndexOf(true);
351
-
352
- if (endRelativeIdx === -1) {
353
- return {
354
- content: "",
355
- error: "Markdown block was not closed properly.",
356
- };
357
- }
358
-
359
- const endIdx = startIdx + 1 + endRelativeIdx;
360
-
361
- const content = lines
362
- .slice(startIdx + 1, endIdx)
363
- .join("\n")
364
- .trim();
365
-
366
- return { content };
367
- }
@@ -1,244 +0,0 @@
1
- import { generateText } from "ai";
2
- import type { Context } from "../context.ts";
3
- import { StaticHTMLFile } from "../fs/static-html-file.ts";
4
- import { Resource } from "../resource.ts";
5
- import type { Secret } from "../secret.ts";
6
- import { type ModelConfig, createModel } from "./client.ts";
7
-
8
- /**
9
- * Properties for creating or updating an HTMLFile
10
- */
11
- export interface HTMLFileProps {
12
- /**
13
- * Path to the HTML file
14
- */
15
- path: string;
16
-
17
- /**
18
- * Base URL for the OpenAI API
19
- * @default 'https://api.openai.com/v1'
20
- */
21
- baseURL?: string;
22
-
23
- /**
24
- * Prompt for generating content
25
- * Use alchemy template literals to include file context:
26
- * @example
27
- * prompt: await alchemy`
28
- * Generate an HTML page using:
29
- * ${alchemy.file("src/templates/base.html")}
30
- * `
31
- */
32
- prompt: string;
33
-
34
- /**
35
- * System prompt for the model
36
- * This is used to provide instructions to the model about how to format the response
37
- * The default system prompt instructs the model to return HTML code inside ```html fences
38
- * @default "You are an HTML code generator. Create HTML code based on the user's requirements. Your response MUST include only HTML code inside ```html fences. Do not include any other text, explanations, or multiple code blocks."
39
- */
40
- system?: string;
41
-
42
- /**
43
- * OpenAI API key to use for generating content
44
- * If not provided, will use OPENAI_API_KEY environment variable
45
- */
46
- apiKey?: Secret;
47
-
48
- /**
49
- * Model configuration
50
- */
51
- model?: ModelConfig;
52
-
53
- /**
54
- * Temperature for controlling randomness in generation.
55
- * Higher values (e.g., 0.8) make output more random,
56
- * lower values (e.g., 0.2) make it more deterministic.
57
- * @default 0.7
58
- */
59
- temperature?: number;
60
- }
61
-
62
- /**
63
- * An HTML file that can be created, updated, and deleted
64
- */
65
- export interface HTMLFile extends HTMLFileProps, Resource<"ai::HTMLFile"> {
66
- /**
67
- * Content of the HTML file
68
- */
69
- content: string;
70
-
71
- /**
72
- * Time at which the file was created
73
- */
74
- createdAt: number;
75
-
76
- /**
77
- * Time at which the file was last updated
78
- */
79
- updatedAt: number;
80
- }
81
-
82
- /**
83
- * Default system prompt for HTML file generation
84
- */
85
- const DEFAULT_HTML_SYSTEM_PROMPT =
86
- "You are an HTML code generator. Create HTML code based on the user's requirements. Your response MUST include only HTML code inside ```html fences. Do not include any other text, explanations, or multiple code blocks.";
87
-
88
- /**
89
- * Resource for generating HTML files using AI models.
90
- * Extracts HTML code from between ```html fences and validates the response.
91
- *
92
- * @example
93
- * // Create a simple landing page
94
- * const landingPage = await HTMLFile("landing-page", {
95
- * path: "./public/index.html",
96
- * prompt: await alchemy`
97
- * Generate a modern landing page for a SaaS product with:
98
- * - Hero section with headline and call-to-action
99
- * - Features section with 3 key features
100
- * - Pricing section with 3 tiers
101
- * - Testimonials section with 2 customer quotes
102
- * - Contact form and footer
103
- * `,
104
- * model: {
105
- * id: "gpt-4o",
106
- * provider: "openai"
107
- * }
108
- * });
109
- *
110
- * @example
111
- * // Generate an HTML email template
112
- * const emailTemplate = await HTMLFile("welcome-email", {
113
- * path: "./emails/welcome.html",
114
- * prompt: await alchemy`
115
- * Create an HTML email template for welcoming new users to our platform.
116
- * The email should include:
117
- * - Company logo and branding
118
- * - Personalized welcome message (use {{name}} placeholder)
119
- * - Three steps to get started
120
- * - Support contact information
121
- * - Unsubscribe footer
122
- *
123
- * Make sure it's responsive and works in all major email clients.
124
- * `,
125
- * temperature: 0.2
126
- * });
127
- *
128
- * @example
129
- * // Generate an HTML component with custom system prompt
130
- * const navComponent = await HTMLFile("navigation", {
131
- * path: "./components/nav.html",
132
- * prompt: await alchemy`
133
- * Create a responsive navigation component with:
134
- * - Logo in the left corner
135
- * - Navigation links: Home, Products, Services, About, Contact
136
- * - Mobile hamburger menu that expands/collapses
137
- * - Login/signup buttons on the right side
138
- * - Dark/light mode toggle
139
- * `,
140
- * system: "You are an expert HTML/CSS developer specializing in responsive components. Create a single HTML file inside ```html fences with no additional text. Use modern HTML5 semantic elements and inline CSS if needed.",
141
- * model: {
142
- * id: "claude-3-opus-20240229",
143
- * provider: "anthropic"
144
- * }
145
- * });
146
- */
147
- export const HTMLFile = Resource(
148
- "ai::HTMLFile",
149
- async function (
150
- this: Context<HTMLFile>,
151
- _id: string,
152
- props: HTMLFileProps,
153
- ): Promise<HTMLFile> {
154
- // Handle deletion phase
155
- if (this.phase === "delete") {
156
- return this.destroy();
157
- }
158
-
159
- // Use provided system prompt or default
160
- const system = props.system || DEFAULT_HTML_SYSTEM_PROMPT;
161
-
162
- // Generate initial content
163
- const { text } = await generateText({
164
- model: createModel(props),
165
- prompt: props.prompt,
166
- system,
167
- providerOptions: props.model?.options,
168
- ...(props.temperature === undefined
169
- ? {}
170
- : { temperature: props.temperature }),
171
- });
172
-
173
- // Extract and validate HTML code
174
- let { code, error } = await extractHTMLCode(text);
175
-
176
- // Re-prompt if there are validation errors
177
- if (error) {
178
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one HTML code block inside \`\`\`html fences.`;
179
-
180
- const { text: retryText } = await generateText({
181
- model: createModel(props),
182
- prompt: props.prompt,
183
- system: errorSystem,
184
- providerOptions: props.model?.options,
185
- ...(props.temperature === undefined
186
- ? {}
187
- : { temperature: props.temperature }),
188
- });
189
-
190
- const retryResult = await extractHTMLCode(retryText);
191
-
192
- if (retryResult.error) {
193
- throw new Error(
194
- `Failed to generate valid HTML code: ${retryResult.error}`,
195
- );
196
- }
197
-
198
- code = retryResult.code;
199
- }
200
-
201
- // Use StaticHTMLFile to create/update the file
202
- const file = await StaticHTMLFile("file", props.path, code);
203
-
204
- // Return the resource
205
- return this({
206
- ...props,
207
- content: file.content,
208
- createdAt: Date.now(),
209
- updatedAt: Date.now(),
210
- });
211
- },
212
- );
213
-
214
- /**
215
- * Extracts HTML code from between ```html fences
216
- * Validates that exactly one HTML code block exists
217
- *
218
- * @param text The text to extract HTML code from
219
- * @returns The extracted HTML code or error message
220
- */
221
- async function extractHTMLCode(
222
- text: string,
223
- ): Promise<{ code: string; error?: string }> {
224
- const htmlCodeRegex = /```html\s*([\s\S]*?)```/g;
225
- const matches = Array.from(text.matchAll(htmlCodeRegex));
226
-
227
- if (matches.length === 0) {
228
- return {
229
- code: "",
230
- error:
231
- "No HTML code block found in the response. Please include your code within ```html fences.",
232
- };
233
- }
234
-
235
- if (matches.length > 1) {
236
- return {
237
- code: "",
238
- error:
239
- "Multiple HTML code blocks found in the response. Please provide exactly one code block within ```html fences.",
240
- };
241
- }
242
-
243
- return { code: matches[0][1].trim() };
244
- }
package/src/ai/index.ts DELETED
@@ -1,10 +0,0 @@
1
- export * from "./ark.ts";
2
- export * from "./astro-file.ts";
3
- export * from "./css-file.ts";
4
- export * from "./data.ts";
5
- export * from "./document.ts";
6
- export * from "./html-file.ts";
7
- export * from "./json-file.ts";
8
- export * from "./typescript-file.ts";
9
- export * from "./vue-file.ts";
10
- export * from "./yaml-file.ts";