alchemy 0.62.3 → 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 (594) hide show
  1. package/bin/alchemy.js +1516 -1202
  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 +6 -2
  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 +4 -2
  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/website.js +1 -1
  163. package/lib/cloudflare/website.js.map +1 -1
  164. package/lib/cloudflare/worker.d.ts +1 -1
  165. package/lib/cloudflare/worker.d.ts.map +1 -1
  166. package/lib/cloudflare/worker.js +12 -7
  167. package/lib/cloudflare/worker.js.map +1 -1
  168. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  169. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  170. package/lib/cloudflare/wrangler.json.js +5 -3
  171. package/lib/cloudflare/wrangler.json.js.map +1 -1
  172. package/lib/docker/container.d.ts +6 -0
  173. package/lib/docker/container.d.ts.map +1 -1
  174. package/lib/docker/container.js +5 -1
  175. package/lib/docker/container.js.map +1 -1
  176. package/lib/docker/network.d.ts +8 -2
  177. package/lib/docker/network.d.ts.map +1 -1
  178. package/lib/docker/network.js +7 -2
  179. package/lib/docker/network.js.map +1 -1
  180. package/lib/docker/volume.d.ts +8 -2
  181. package/lib/docker/volume.d.ts.map +1 -1
  182. package/lib/docker/volume.js +6 -4
  183. package/lib/docker/volume.js.map +1 -1
  184. package/lib/esbuild/bundle.d.ts +1 -1
  185. package/lib/fs/index.d.ts +0 -8
  186. package/lib/fs/index.d.ts.map +1 -1
  187. package/lib/fs/index.js +0 -8
  188. package/lib/fs/index.js.map +1 -1
  189. package/lib/github/client.d.ts +1 -1
  190. package/lib/github/client.d.ts.map +1 -1
  191. package/lib/github/client.js +2 -1
  192. package/lib/github/client.js.map +1 -1
  193. package/lib/github/repository-environment.d.ts +8 -2
  194. package/lib/github/repository-environment.d.ts.map +1 -1
  195. package/lib/github/repository-environment.js +16 -12
  196. package/lib/github/repository-environment.js.map +1 -1
  197. package/lib/neon/project.d.ts +7 -1
  198. package/lib/neon/project.d.ts.map +1 -1
  199. package/lib/neon/project.js +10 -6
  200. package/lib/neon/project.js.map +1 -1
  201. package/lib/planetscale/branch.d.ts +4 -2
  202. package/lib/planetscale/branch.d.ts.map +1 -1
  203. package/lib/planetscale/branch.js +18 -12
  204. package/lib/planetscale/branch.js.map +1 -1
  205. package/lib/planetscale/database.d.ts +8 -2
  206. package/lib/planetscale/database.d.ts.map +1 -1
  207. package/lib/planetscale/database.js +24 -16
  208. package/lib/planetscale/database.js.map +1 -1
  209. package/lib/planetscale/password.d.ts +8 -2
  210. package/lib/planetscale/password.d.ts.map +1 -1
  211. package/lib/planetscale/password.js +2 -2
  212. package/lib/planetscale/password.js.map +1 -1
  213. package/lib/resource.d.ts +0 -2
  214. package/lib/resource.d.ts.map +1 -1
  215. package/lib/resource.js +1 -9
  216. package/lib/resource.js.map +1 -1
  217. package/lib/scope.d.ts +9 -3
  218. package/lib/scope.d.ts.map +1 -1
  219. package/lib/scope.js +21 -34
  220. package/lib/scope.js.map +1 -1
  221. package/lib/sentry/client-key.d.ts +7 -1
  222. package/lib/sentry/client-key.d.ts.map +1 -1
  223. package/lib/sentry/client-key.js +45 -6
  224. package/lib/sentry/client-key.js.map +1 -1
  225. package/lib/sentry/project.d.ts +8 -2
  226. package/lib/sentry/project.d.ts.map +1 -1
  227. package/lib/sentry/project.js +35 -5
  228. package/lib/sentry/project.js.map +1 -1
  229. package/lib/sentry/team.d.ts +8 -2
  230. package/lib/sentry/team.d.ts.map +1 -1
  231. package/lib/sentry/team.js +36 -6
  232. package/lib/sentry/team.js.map +1 -1
  233. package/lib/serde.d.ts +0 -5
  234. package/lib/serde.d.ts.map +1 -1
  235. package/lib/serde.js +0 -28
  236. package/lib/serde.js.map +1 -1
  237. package/lib/state/d1-state-store.d.ts +1 -1
  238. package/lib/state/d1-state-store.d.ts.map +1 -1
  239. package/lib/state/d1-state-store.js +5 -5
  240. package/lib/state/d1-state-store.js.map +1 -1
  241. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  242. package/lib/state/sqlite-state-store.js +7 -11
  243. package/lib/state/sqlite-state-store.js.map +1 -1
  244. package/lib/stripe/card.d.ts.map +1 -1
  245. package/lib/stripe/card.js +3 -2
  246. package/lib/stripe/card.js.map +1 -1
  247. package/lib/stripe/client.d.ts +2 -2
  248. package/lib/stripe/client.d.ts.map +1 -1
  249. package/lib/stripe/client.js +4 -3
  250. package/lib/stripe/client.js.map +1 -1
  251. package/lib/stripe/coupon.d.ts.map +1 -1
  252. package/lib/stripe/coupon.js +4 -3
  253. package/lib/stripe/coupon.js.map +1 -1
  254. package/lib/stripe/customer.js +2 -2
  255. package/lib/stripe/customer.js.map +1 -1
  256. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  257. package/lib/stripe/entitlements-feature.js +3 -2
  258. package/lib/stripe/entitlements-feature.js.map +1 -1
  259. package/lib/stripe/file.d.ts.map +1 -1
  260. package/lib/stripe/file.js +3 -2
  261. package/lib/stripe/file.js.map +1 -1
  262. package/lib/stripe/meter.js +2 -2
  263. package/lib/stripe/meter.js.map +1 -1
  264. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  265. package/lib/stripe/portal-configuration.js +3 -2
  266. package/lib/stripe/portal-configuration.js.map +1 -1
  267. package/lib/stripe/price.d.ts.map +1 -1
  268. package/lib/stripe/price.js +3 -2
  269. package/lib/stripe/price.js.map +1 -1
  270. package/lib/stripe/product-feature.d.ts.map +1 -1
  271. package/lib/stripe/product-feature.js +3 -2
  272. package/lib/stripe/product-feature.js.map +1 -1
  273. package/lib/stripe/product.d.ts.map +1 -1
  274. package/lib/stripe/product.js +3 -2
  275. package/lib/stripe/product.js.map +1 -1
  276. package/lib/stripe/promotion-code.d.ts.map +1 -1
  277. package/lib/stripe/promotion-code.js +3 -2
  278. package/lib/stripe/promotion-code.js.map +1 -1
  279. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  280. package/lib/stripe/shipping-rate.js +4 -3
  281. package/lib/stripe/shipping-rate.js.map +1 -1
  282. package/lib/stripe/tax-rate.d.ts.map +1 -1
  283. package/lib/stripe/tax-rate.js +3 -2
  284. package/lib/stripe/tax-rate.js.map +1 -1
  285. package/lib/stripe/webhook.d.ts.map +1 -1
  286. package/lib/stripe/webhook.js +4 -3
  287. package/lib/stripe/webhook.js.map +1 -1
  288. package/lib/test/vitest.d.ts.map +1 -1
  289. package/lib/test/vitest.js +1 -0
  290. package/lib/test/vitest.js.map +1 -1
  291. package/lib/upstash/redis.d.ts +8 -2
  292. package/lib/upstash/redis.d.ts.map +1 -1
  293. package/lib/upstash/redis.js +5 -4
  294. package/lib/upstash/redis.js.map +1 -1
  295. package/lib/util/ignore-matcher.d.ts.map +1 -1
  296. package/lib/util/ignore-matcher.js +3 -1
  297. package/lib/util/ignore-matcher.js.map +1 -1
  298. package/lib/util/peer.d.ts +10 -0
  299. package/lib/util/peer.d.ts.map +1 -0
  300. package/lib/util/peer.js +42 -0
  301. package/lib/util/peer.js.map +1 -0
  302. package/lib/vercel/project.d.ts +7 -1
  303. package/lib/vercel/project.d.ts.map +1 -1
  304. package/lib/vercel/project.js +28 -0
  305. package/lib/vercel/project.js.map +1 -1
  306. package/package.json +88 -74
  307. package/src/alchemy.ts +76 -222
  308. package/src/apply.ts +6 -19
  309. package/src/aws/account-id.ts +6 -3
  310. package/src/aws/bucket.ts +43 -32
  311. package/src/aws/ec2/security-group.ts +15 -3
  312. package/src/aws/function.ts +65 -39
  313. package/src/aws/policy-attachment.ts +10 -6
  314. package/src/aws/policy.ts +33 -15
  315. package/src/aws/queue.ts +50 -29
  316. package/src/aws/role.ts +37 -20
  317. package/src/aws/ses.ts +24 -20
  318. package/src/aws/ssm-parameter.ts +40 -20
  319. package/src/aws/table.ts +35 -17
  320. package/src/cloudflare/account-api-token.ts +9 -7
  321. package/src/cloudflare/ai-gateway.ts +37 -34
  322. package/src/cloudflare/api-schema.ts +33 -26
  323. package/src/cloudflare/api-shield.ts +15 -2
  324. package/src/cloudflare/astro/astro.ts +5 -1
  325. package/src/cloudflare/astro/plugin.ts +2 -1
  326. package/src/cloudflare/bindings.ts +2 -2
  327. package/src/cloudflare/bound.ts +1 -1
  328. package/src/cloudflare/bucket.ts +242 -3
  329. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  330. package/src/cloudflare/container.ts +23 -12
  331. package/src/cloudflare/custom-domain.ts +2 -2
  332. package/src/cloudflare/d1-database.ts +10 -3
  333. package/src/cloudflare/dispatch-namespace.ts +10 -7
  334. package/src/cloudflare/hyperdrive.ts +13 -3
  335. package/src/cloudflare/kv-namespace.ts +25 -2
  336. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  337. package/src/cloudflare/miniflare/paths.ts +13 -0
  338. package/src/cloudflare/pipeline.ts +76 -28
  339. package/src/cloudflare/queue-consumer.ts +1 -1
  340. package/src/cloudflare/queue.ts +26 -14
  341. package/src/cloudflare/react-router/react-router.ts +28 -2
  342. package/src/cloudflare/redwood/plugin.ts +3 -2
  343. package/src/cloudflare/route.ts +1 -1
  344. package/src/cloudflare/ruleset.ts +7 -2
  345. package/src/cloudflare/secret.ts +20 -31
  346. package/src/cloudflare/secrets-store.ts +7 -3
  347. package/src/cloudflare/tunnel.ts +13 -2
  348. package/src/cloudflare/vectorize-index.ts +14 -3
  349. package/src/cloudflare/vite/plugin.ts +3 -2
  350. package/src/cloudflare/website.ts +1 -1
  351. package/src/cloudflare/worker.ts +35 -23
  352. package/src/cloudflare/wrangler.json.ts +7 -4
  353. package/src/docker/container.ts +13 -1
  354. package/src/docker/network.ts +18 -3
  355. package/src/docker/volume.ts +17 -6
  356. package/src/fs/index.ts +0 -8
  357. package/src/github/client.ts +6 -2
  358. package/src/github/repository-environment.ts +27 -13
  359. package/src/neon/project.ts +20 -6
  360. package/src/planetscale/branch.ts +24 -13
  361. package/src/planetscale/database.ts +38 -17
  362. package/src/planetscale/password.ts +10 -3
  363. package/src/resource.ts +1 -10
  364. package/src/scope.ts +29 -38
  365. package/src/sentry/client-key.ts +74 -6
  366. package/src/sentry/project.ts +59 -6
  367. package/src/sentry/team.ts +55 -7
  368. package/src/serde.ts +0 -44
  369. package/src/state/d1-state-store.ts +13 -6
  370. package/src/state/sqlite-state-store.ts +16 -17
  371. package/src/stripe/card.ts +5 -2
  372. package/src/stripe/client.ts +10 -3
  373. package/src/stripe/coupon.ts +4 -3
  374. package/src/stripe/customer.ts +2 -2
  375. package/src/stripe/entitlements-feature.ts +5 -2
  376. package/src/stripe/file.ts +3 -2
  377. package/src/stripe/meter.ts +2 -2
  378. package/src/stripe/portal-configuration.ts +5 -2
  379. package/src/stripe/price.ts +3 -2
  380. package/src/stripe/product-feature.ts +5 -2
  381. package/src/stripe/product.ts +3 -2
  382. package/src/stripe/promotion-code.ts +3 -2
  383. package/src/stripe/shipping-rate.ts +4 -3
  384. package/src/stripe/tax-rate.ts +3 -2
  385. package/src/stripe/webhook.ts +4 -3
  386. package/src/test/vitest.ts +1 -0
  387. package/src/upstash/redis.ts +15 -5
  388. package/src/util/ignore-matcher.ts +3 -1
  389. package/src/util/peer.ts +53 -0
  390. package/src/vercel/project.ts +46 -1
  391. package/templates/hono/README.md +19 -0
  392. package/templates/hono/_env +1 -0
  393. package/templates/hono/_env.example +1 -0
  394. package/templates/hono/_gitignore +34 -0
  395. package/templates/hono/alchemy.run.ts +22 -0
  396. package/templates/hono/package.json +18 -0
  397. package/templates/hono/src/index.ts +17 -0
  398. package/templates/hono/tsconfig.json +13 -0
  399. package/templates/hono/types/env.d.ts +16 -0
  400. package/templates/react-router/vite.config.ts +5 -3
  401. package/workers/cloudflare-state-store.js +69 -74
  402. package/workers/dofs-state-store.js +1 -1
  403. package/bin/bootstrap-s3.ts +0 -255
  404. package/lib/ai/ark.d.ts +0 -12
  405. package/lib/ai/ark.d.ts.map +0 -1
  406. package/lib/ai/ark.js +0 -87
  407. package/lib/ai/ark.js.map +0 -1
  408. package/lib/ai/astro-file.d.ts +0 -138
  409. package/lib/ai/astro-file.d.ts.map +0 -1
  410. package/lib/ai/astro-file.js +0 -158
  411. package/lib/ai/astro-file.js.map +0 -1
  412. package/lib/ai/client.d.ts +0 -51
  413. package/lib/ai/client.d.ts.map +0 -1
  414. package/lib/ai/client.js +0 -58
  415. package/lib/ai/client.js.map +0 -1
  416. package/lib/ai/css-file.d.ts +0 -132
  417. package/lib/ai/css-file.d.ts.map +0 -1
  418. package/lib/ai/css-file.js +0 -142
  419. package/lib/ai/css-file.js.map +0 -1
  420. package/lib/ai/data.d.ts +0 -152
  421. package/lib/ai/data.d.ts.map +0 -1
  422. package/lib/ai/data.js +0 -120
  423. package/lib/ai/data.js.map +0 -1
  424. package/lib/ai/document.d.ts +0 -208
  425. package/lib/ai/document.d.ts.map +0 -1
  426. package/lib/ai/document.js +0 -206
  427. package/lib/ai/document.js.map +0 -1
  428. package/lib/ai/html-file.d.ts +0 -129
  429. package/lib/ai/html-file.d.ts.map +0 -1
  430. package/lib/ai/html-file.js +0 -139
  431. package/lib/ai/html-file.js.map +0 -1
  432. package/lib/ai/index.d.ts +0 -11
  433. package/lib/ai/index.d.ts.map +0 -1
  434. package/lib/ai/index.js +0 -11
  435. package/lib/ai/index.js.map +0 -1
  436. package/lib/ai/json-file.d.ts +0 -161
  437. package/lib/ai/json-file.d.ts.map +0 -1
  438. package/lib/ai/json-file.js +0 -188
  439. package/lib/ai/json-file.js.map +0 -1
  440. package/lib/ai/typescript-file.d.ts +0 -140
  441. package/lib/ai/typescript-file.d.ts.map +0 -1
  442. package/lib/ai/typescript-file.js +0 -146
  443. package/lib/ai/typescript-file.js.map +0 -1
  444. package/lib/ai/vue-file.d.ts +0 -127
  445. package/lib/ai/vue-file.d.ts.map +0 -1
  446. package/lib/ai/vue-file.js +0 -137
  447. package/lib/ai/vue-file.js.map +0 -1
  448. package/lib/ai/yaml-file.d.ts +0 -170
  449. package/lib/ai/yaml-file.d.ts.map +0 -1
  450. package/lib/ai/yaml-file.js +0 -201
  451. package/lib/ai/yaml-file.js.map +0 -1
  452. package/lib/fs/static-astro-file.d.ts +0 -35
  453. package/lib/fs/static-astro-file.d.ts.map +0 -1
  454. package/lib/fs/static-astro-file.js +0 -40
  455. package/lib/fs/static-astro-file.js.map +0 -1
  456. package/lib/fs/static-css-file.d.ts +0 -25
  457. package/lib/fs/static-css-file.d.ts.map +0 -1
  458. package/lib/fs/static-css-file.js +0 -30
  459. package/lib/fs/static-css-file.js.map +0 -1
  460. package/lib/fs/static-html-file.d.ts +0 -32
  461. package/lib/fs/static-html-file.d.ts.map +0 -1
  462. package/lib/fs/static-html-file.js +0 -37
  463. package/lib/fs/static-html-file.js.map +0 -1
  464. package/lib/fs/static-json-file.d.ts +0 -18
  465. package/lib/fs/static-json-file.d.ts.map +0 -1
  466. package/lib/fs/static-json-file.js +0 -19
  467. package/lib/fs/static-json-file.js.map +0 -1
  468. package/lib/fs/static-text-file.d.ts +0 -13
  469. package/lib/fs/static-text-file.d.ts.map +0 -1
  470. package/lib/fs/static-text-file.js +0 -9
  471. package/lib/fs/static-text-file.js.map +0 -1
  472. package/lib/fs/static-typescript-file.d.ts +0 -20
  473. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  474. package/lib/fs/static-typescript-file.js +0 -16
  475. package/lib/fs/static-typescript-file.js.map +0 -1
  476. package/lib/fs/static-vue-file.d.ts +0 -29
  477. package/lib/fs/static-vue-file.d.ts.map +0 -1
  478. package/lib/fs/static-vue-file.js +0 -34
  479. package/lib/fs/static-vue-file.js.map +0 -1
  480. package/lib/fs/static-yaml-file.d.ts +0 -23
  481. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  482. package/lib/fs/static-yaml-file.js +0 -10
  483. package/lib/fs/static-yaml-file.js.map +0 -1
  484. package/lib/internal/docs/providers.d.ts +0 -34
  485. package/lib/internal/docs/providers.d.ts.map +0 -1
  486. package/lib/internal/docs/providers.js +0 -200
  487. package/lib/internal/docs/providers.js.map +0 -1
  488. package/lib/runtime/bind.d.ts +0 -25
  489. package/lib/runtime/bind.d.ts.map +0 -1
  490. package/lib/runtime/bind.js +0 -76
  491. package/lib/runtime/bind.js.map +0 -1
  492. package/lib/runtime/global.d.ts +0 -8
  493. package/lib/runtime/global.d.ts.map +0 -1
  494. package/lib/runtime/global.js +0 -3
  495. package/lib/runtime/global.js.map +0 -1
  496. package/lib/runtime/plugin.d.ts +0 -35
  497. package/lib/runtime/plugin.d.ts.map +0 -1
  498. package/lib/runtime/plugin.js +0 -134
  499. package/lib/runtime/plugin.js.map +0 -1
  500. package/lib/runtime/shims.d.ts +0 -6
  501. package/lib/runtime/shims.d.ts.map +0 -1
  502. package/lib/runtime/shims.js +0 -27
  503. package/lib/runtime/shims.js.map +0 -1
  504. package/lib/runtime/state.d.ts +0 -5
  505. package/lib/runtime/state.d.ts.map +0 -1
  506. package/lib/runtime/state.js +0 -4
  507. package/lib/runtime/state.js.map +0 -1
  508. package/lib/web/astro.d.ts +0 -148
  509. package/lib/web/astro.d.ts.map +0 -1
  510. package/lib/web/astro.js +0 -419
  511. package/lib/web/astro.js.map +0 -1
  512. package/lib/web/shadcn-component.d.ts +0 -30
  513. package/lib/web/shadcn-component.d.ts.map +0 -1
  514. package/lib/web/shadcn-component.js +0 -25
  515. package/lib/web/shadcn-component.js.map +0 -1
  516. package/lib/web/shadcn.d.ts +0 -98
  517. package/lib/web/shadcn.d.ts.map +0 -1
  518. package/lib/web/shadcn.js +0 -102
  519. package/lib/web/shadcn.js.map +0 -1
  520. package/lib/web/tailwind.d.ts +0 -65
  521. package/lib/web/tailwind.d.ts.map +0 -1
  522. package/lib/web/tailwind.js +0 -98
  523. package/lib/web/tailwind.js.map +0 -1
  524. package/lib/web/vite.d.ts +0 -96
  525. package/lib/web/vite.d.ts.map +0 -1
  526. package/lib/web/vite.js +0 -232
  527. package/lib/web/vite.js.map +0 -1
  528. package/lib/web/vitepress/config.d.ts +0 -12
  529. package/lib/web/vitepress/config.d.ts.map +0 -1
  530. package/lib/web/vitepress/config.js +0 -33
  531. package/lib/web/vitepress/config.js.map +0 -1
  532. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  533. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  534. package/lib/web/vitepress/custom-theme.js +0 -337
  535. package/lib/web/vitepress/custom-theme.js.map +0 -1
  536. package/lib/web/vitepress/dependencies.d.ts +0 -13
  537. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  538. package/lib/web/vitepress/dependencies.js +0 -37
  539. package/lib/web/vitepress/dependencies.js.map +0 -1
  540. package/lib/web/vitepress/home-page.d.ts +0 -247
  541. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  542. package/lib/web/vitepress/home-page.js +0 -146
  543. package/lib/web/vitepress/home-page.js.map +0 -1
  544. package/lib/web/vitepress/index.d.ts +0 -6
  545. package/lib/web/vitepress/index.d.ts.map +0 -1
  546. package/lib/web/vitepress/index.js +0 -6
  547. package/lib/web/vitepress/index.js.map +0 -1
  548. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  549. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  550. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  551. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  552. package/lib/web/vitepress/vitepress.d.ts +0 -75
  553. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  554. package/lib/web/vitepress/vitepress.js +0 -254
  555. package/lib/web/vitepress/vitepress.js.map +0 -1
  556. package/src/ai/ark.ts +0 -118
  557. package/src/ai/astro-file.ts +0 -270
  558. package/src/ai/client.ts +0 -117
  559. package/src/ai/css-file.ts +0 -247
  560. package/src/ai/data.ts +0 -221
  561. package/src/ai/document.ts +0 -367
  562. package/src/ai/html-file.ts +0 -244
  563. package/src/ai/index.ts +0 -10
  564. package/src/ai/json-file.ts +0 -325
  565. package/src/ai/typescript-file.ts +0 -259
  566. package/src/ai/vue-file.ts +0 -242
  567. package/src/ai/yaml-file.ts +0 -328
  568. package/src/fs/static-astro-file.ts +0 -45
  569. package/src/fs/static-css-file.ts +0 -35
  570. package/src/fs/static-html-file.ts +0 -42
  571. package/src/fs/static-json-file.ts +0 -38
  572. package/src/fs/static-text-file.ts +0 -23
  573. package/src/fs/static-typescript-file.ts +0 -37
  574. package/src/fs/static-vue-file.ts +0 -39
  575. package/src/fs/static-yaml-file.ts +0 -33
  576. package/src/internal/docs/providers.ts +0 -286
  577. package/src/runtime/bind.ts +0 -95
  578. package/src/runtime/global.ts +0 -10
  579. package/src/runtime/plugin.ts +0 -163
  580. package/src/runtime/shims.js +0 -34
  581. package/src/runtime/state.ts +0 -9
  582. package/src/web/astro.ts +0 -643
  583. package/src/web/shadcn-component.ts +0 -72
  584. package/src/web/shadcn.ts +0 -221
  585. package/src/web/tailwind.ts +0 -167
  586. package/src/web/vite.ts +0 -407
  587. package/src/web/vitepress/config.ts +0 -50
  588. package/src/web/vitepress/custom-theme.ts +0 -514
  589. package/src/web/vitepress/dependencies.ts +0 -69
  590. package/src/web/vitepress/home-page.ts +0 -378
  591. package/src/web/vitepress/index.ts +0 -5
  592. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  593. package/src/web/vitepress/vitepress.ts +0 -372
  594. 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";