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.
- package/bin/alchemy.js +1518 -1204
- package/bin/commands/deploy.ts +2 -0
- package/bin/commands/dev.ts +2 -0
- package/bin/services/execute-alchemy.ts +11 -0
- package/bin/services/template-manager.ts +2 -0
- package/bin/types.ts +2 -1
- package/lib/alchemy.d.ts +6 -22
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +65 -169
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts +0 -2
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +2 -16
- package/lib/apply.js.map +1 -1
- package/lib/aws/account-id.d.ts.map +1 -1
- package/lib/aws/account-id.js +3 -2
- package/lib/aws/account-id.js.map +1 -1
- package/lib/aws/bucket.d.ts +8 -2
- package/lib/aws/bucket.d.ts.map +1 -1
- package/lib/aws/bucket.js +21 -14
- package/lib/aws/bucket.js.map +1 -1
- package/lib/aws/ec2/security-group.d.ts +8 -2
- package/lib/aws/ec2/security-group.d.ts.map +1 -1
- package/lib/aws/ec2/security-group.js +7 -2
- package/lib/aws/ec2/security-group.js.map +1 -1
- package/lib/aws/function.d.ts +9 -3
- package/lib/aws/function.d.ts.map +1 -1
- package/lib/aws/function.js +35 -26
- package/lib/aws/function.js.map +1 -1
- package/lib/aws/policy-attachment.d.ts.map +1 -1
- package/lib/aws/policy-attachment.js +2 -1
- package/lib/aws/policy-attachment.js.map +1 -1
- package/lib/aws/policy.d.ts +8 -2
- package/lib/aws/policy.d.ts.map +1 -1
- package/lib/aws/policy.js +13 -4
- package/lib/aws/policy.js.map +1 -1
- package/lib/aws/queue.d.ts +8 -2
- package/lib/aws/queue.d.ts.map +1 -1
- package/lib/aws/queue.js +22 -14
- package/lib/aws/queue.js.map +1 -1
- package/lib/aws/role.d.ts +8 -2
- package/lib/aws/role.d.ts.map +1 -1
- package/lib/aws/role.js +10 -3
- package/lib/aws/role.js.map +1 -1
- package/lib/aws/ses.d.ts +1 -1
- package/lib/aws/ses.d.ts.map +1 -1
- package/lib/aws/ses.js +2 -1
- package/lib/aws/ses.js.map +1 -1
- package/lib/aws/ssm-parameter.d.ts +8 -2
- package/lib/aws/ssm-parameter.d.ts.map +1 -1
- package/lib/aws/ssm-parameter.js +15 -10
- package/lib/aws/ssm-parameter.js.map +1 -1
- package/lib/aws/table.d.ts +8 -2
- package/lib/aws/table.d.ts.map +1 -1
- package/lib/aws/table.js +17 -9
- package/lib/aws/table.js.map +1 -1
- package/lib/cloudflare/account-api-token.d.ts +2 -2
- package/lib/cloudflare/account-api-token.d.ts.map +1 -1
- package/lib/cloudflare/account-api-token.js +7 -6
- package/lib/cloudflare/account-api-token.js.map +1 -1
- package/lib/cloudflare/ai-gateway.d.ts +9 -4
- package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
- package/lib/cloudflare/ai-gateway.js +20 -24
- package/lib/cloudflare/ai-gateway.js.map +1 -1
- package/lib/cloudflare/api-schema.d.ts +2 -2
- package/lib/cloudflare/api-schema.d.ts.map +1 -1
- package/lib/cloudflare/api-schema.js +6 -2
- package/lib/cloudflare/api-schema.js.map +1 -1
- package/lib/cloudflare/api-shield.d.ts +5 -1
- package/lib/cloudflare/api-shield.d.ts.map +1 -1
- package/lib/cloudflare/api-shield.js +6 -1
- package/lib/cloudflare/api-shield.js.map +1 -1
- package/lib/cloudflare/assets.d.ts +1 -1
- package/lib/cloudflare/assets.d.ts.map +1 -1
- package/lib/cloudflare/astro/astro.d.ts.map +1 -1
- package/lib/cloudflare/astro/astro.js +3 -1
- package/lib/cloudflare/astro/astro.js.map +1 -1
- package/lib/cloudflare/astro/plugin.d.ts +2 -1
- package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
- package/lib/cloudflare/astro/plugin.js.map +1 -1
- package/lib/cloudflare/bindings.d.ts +2 -2
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bound.d.ts +1 -1
- package/lib/cloudflare/bound.d.ts.map +1 -1
- package/lib/cloudflare/bucket.d.ts +120 -1
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +80 -2
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/container.d.ts +10 -4
- package/lib/cloudflare/container.d.ts.map +1 -1
- package/lib/cloudflare/container.js +12 -9
- package/lib/cloudflare/container.js.map +1 -1
- package/lib/cloudflare/custom-domain.js +2 -1
- package/lib/cloudflare/custom-domain.js.map +1 -1
- package/lib/cloudflare/d1-database.d.ts +1 -1
- package/lib/cloudflare/d1-database.d.ts.map +1 -1
- package/lib/cloudflare/d1-database.js +7 -3
- package/lib/cloudflare/d1-database.js.map +1 -1
- package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
- package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
- package/lib/cloudflare/dispatch-namespace.js +7 -5
- package/lib/cloudflare/dispatch-namespace.js.map +1 -1
- package/lib/cloudflare/hyperdrive.d.ts +7 -1
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +2 -1
- package/lib/cloudflare/hyperdrive.js.map +1 -1
- package/lib/cloudflare/kv-namespace.d.ts +3 -0
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
- package/lib/cloudflare/kv-namespace.js +11 -2
- package/lib/cloudflare/kv-namespace.js.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
- package/lib/cloudflare/miniflare/paths.d.ts +4 -0
- package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/paths.js +11 -0
- package/lib/cloudflare/miniflare/paths.js.map +1 -1
- package/lib/cloudflare/pipeline.d.ts +14 -3
- package/lib/cloudflare/pipeline.d.ts.map +1 -1
- package/lib/cloudflare/pipeline.js +31 -2
- package/lib/cloudflare/pipeline.js.map +1 -1
- package/lib/cloudflare/queue-consumer.js +1 -1
- package/lib/cloudflare/queue-consumer.js.map +1 -1
- package/lib/cloudflare/queue.d.ts +6 -4
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +13 -9
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/react-router/plugin.d.ts +1 -1
- package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
- package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
- package/lib/cloudflare/react-router/react-router.js +32 -2
- package/lib/cloudflare/react-router/react-router.js.map +1 -1
- package/lib/cloudflare/redwood/plugin.d.ts +2 -1
- package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
- package/lib/cloudflare/redwood/plugin.js.map +1 -1
- package/lib/cloudflare/route.js +1 -1
- package/lib/cloudflare/route.js.map +1 -1
- package/lib/cloudflare/ruleset.d.ts +3 -1
- package/lib/cloudflare/ruleset.d.ts.map +1 -1
- package/lib/cloudflare/ruleset.js +3 -2
- package/lib/cloudflare/ruleset.js.map +1 -1
- package/lib/cloudflare/secret.d.ts +6 -23
- package/lib/cloudflare/secret.d.ts.map +1 -1
- package/lib/cloudflare/secret.js +8 -4
- package/lib/cloudflare/secret.js.map +1 -1
- package/lib/cloudflare/secrets-store.d.ts +1 -1
- package/lib/cloudflare/secrets-store.d.ts.map +1 -1
- package/lib/cloudflare/secrets-store.js +5 -2
- package/lib/cloudflare/secrets-store.js.map +1 -1
- package/lib/cloudflare/tunnel.d.ts +5 -1
- package/lib/cloudflare/tunnel.d.ts.map +1 -1
- package/lib/cloudflare/tunnel.js +5 -1
- package/lib/cloudflare/tunnel.js.map +1 -1
- package/lib/cloudflare/vectorize-index.d.ts +7 -1
- package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-index.js +5 -2
- package/lib/cloudflare/vectorize-index.js.map +1 -1
- package/lib/cloudflare/vite/plugin.d.ts +2 -1
- package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
- package/lib/cloudflare/vite/plugin.js.map +1 -1
- package/lib/cloudflare/vite/vite.d.ts +1 -1
- package/lib/cloudflare/vite/vite.d.ts.map +1 -1
- package/lib/cloudflare/vite/vite.js +1 -1
- package/lib/cloudflare/vite/vite.js.map +1 -1
- package/lib/cloudflare/website.js +1 -1
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +1 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +12 -7
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +1 -1
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +5 -3
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/docker/container.d.ts +6 -0
- package/lib/docker/container.d.ts.map +1 -1
- package/lib/docker/container.js +5 -1
- package/lib/docker/container.js.map +1 -1
- package/lib/docker/network.d.ts +8 -2
- package/lib/docker/network.d.ts.map +1 -1
- package/lib/docker/network.js +7 -2
- package/lib/docker/network.js.map +1 -1
- package/lib/docker/volume.d.ts +8 -2
- package/lib/docker/volume.d.ts.map +1 -1
- package/lib/docker/volume.js +6 -4
- package/lib/docker/volume.js.map +1 -1
- package/lib/esbuild/bundle.d.ts +1 -1
- package/lib/fs/index.d.ts +0 -8
- package/lib/fs/index.d.ts.map +1 -1
- package/lib/fs/index.js +0 -8
- package/lib/fs/index.js.map +1 -1
- package/lib/github/client.d.ts +1 -1
- package/lib/github/client.d.ts.map +1 -1
- package/lib/github/client.js +2 -1
- package/lib/github/client.js.map +1 -1
- package/lib/github/repository-environment.d.ts +8 -2
- package/lib/github/repository-environment.d.ts.map +1 -1
- package/lib/github/repository-environment.js +16 -12
- package/lib/github/repository-environment.js.map +1 -1
- package/lib/neon/project.d.ts +7 -1
- package/lib/neon/project.d.ts.map +1 -1
- package/lib/neon/project.js +10 -6
- package/lib/neon/project.js.map +1 -1
- package/lib/planetscale/branch.d.ts +4 -2
- package/lib/planetscale/branch.d.ts.map +1 -1
- package/lib/planetscale/branch.js +18 -12
- package/lib/planetscale/branch.js.map +1 -1
- package/lib/planetscale/database.d.ts +8 -2
- package/lib/planetscale/database.d.ts.map +1 -1
- package/lib/planetscale/database.js +24 -16
- package/lib/planetscale/database.js.map +1 -1
- package/lib/planetscale/password.d.ts +8 -2
- package/lib/planetscale/password.d.ts.map +1 -1
- package/lib/planetscale/password.js +2 -2
- package/lib/planetscale/password.js.map +1 -1
- package/lib/resource.d.ts +0 -2
- package/lib/resource.d.ts.map +1 -1
- package/lib/resource.js +1 -9
- package/lib/resource.js.map +1 -1
- package/lib/scope.d.ts +9 -3
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +21 -34
- package/lib/scope.js.map +1 -1
- package/lib/sentry/client-key.d.ts +7 -1
- package/lib/sentry/client-key.d.ts.map +1 -1
- package/lib/sentry/client-key.js +45 -6
- package/lib/sentry/client-key.js.map +1 -1
- package/lib/sentry/project.d.ts +8 -2
- package/lib/sentry/project.d.ts.map +1 -1
- package/lib/sentry/project.js +35 -5
- package/lib/sentry/project.js.map +1 -1
- package/lib/sentry/team.d.ts +8 -2
- package/lib/sentry/team.d.ts.map +1 -1
- package/lib/sentry/team.js +36 -6
- package/lib/sentry/team.js.map +1 -1
- package/lib/serde.d.ts +0 -5
- package/lib/serde.d.ts.map +1 -1
- package/lib/serde.js +0 -28
- package/lib/serde.js.map +1 -1
- package/lib/state/d1-state-store.d.ts +1 -1
- package/lib/state/d1-state-store.d.ts.map +1 -1
- package/lib/state/d1-state-store.js +5 -5
- package/lib/state/d1-state-store.js.map +1 -1
- package/lib/state/sqlite-state-store.d.ts.map +1 -1
- package/lib/state/sqlite-state-store.js +7 -11
- package/lib/state/sqlite-state-store.js.map +1 -1
- package/lib/stripe/card.d.ts.map +1 -1
- package/lib/stripe/card.js +3 -2
- package/lib/stripe/card.js.map +1 -1
- package/lib/stripe/client.d.ts +2 -2
- package/lib/stripe/client.d.ts.map +1 -1
- package/lib/stripe/client.js +4 -3
- package/lib/stripe/client.js.map +1 -1
- package/lib/stripe/coupon.d.ts.map +1 -1
- package/lib/stripe/coupon.js +4 -3
- package/lib/stripe/coupon.js.map +1 -1
- package/lib/stripe/customer.js +2 -2
- package/lib/stripe/customer.js.map +1 -1
- package/lib/stripe/entitlements-feature.d.ts.map +1 -1
- package/lib/stripe/entitlements-feature.js +3 -2
- package/lib/stripe/entitlements-feature.js.map +1 -1
- package/lib/stripe/file.d.ts.map +1 -1
- package/lib/stripe/file.js +3 -2
- package/lib/stripe/file.js.map +1 -1
- package/lib/stripe/meter.js +2 -2
- package/lib/stripe/meter.js.map +1 -1
- package/lib/stripe/portal-configuration.d.ts.map +1 -1
- package/lib/stripe/portal-configuration.js +3 -2
- package/lib/stripe/portal-configuration.js.map +1 -1
- package/lib/stripe/price.d.ts.map +1 -1
- package/lib/stripe/price.js +3 -2
- package/lib/stripe/price.js.map +1 -1
- package/lib/stripe/product-feature.d.ts.map +1 -1
- package/lib/stripe/product-feature.js +3 -2
- package/lib/stripe/product-feature.js.map +1 -1
- package/lib/stripe/product.d.ts.map +1 -1
- package/lib/stripe/product.js +3 -2
- package/lib/stripe/product.js.map +1 -1
- package/lib/stripe/promotion-code.d.ts.map +1 -1
- package/lib/stripe/promotion-code.js +3 -2
- package/lib/stripe/promotion-code.js.map +1 -1
- package/lib/stripe/shipping-rate.d.ts.map +1 -1
- package/lib/stripe/shipping-rate.js +4 -3
- package/lib/stripe/shipping-rate.js.map +1 -1
- package/lib/stripe/tax-rate.d.ts.map +1 -1
- package/lib/stripe/tax-rate.js +3 -2
- package/lib/stripe/tax-rate.js.map +1 -1
- package/lib/stripe/webhook.d.ts.map +1 -1
- package/lib/stripe/webhook.js +4 -3
- package/lib/stripe/webhook.js.map +1 -1
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +1 -0
- package/lib/test/vitest.js.map +1 -1
- package/lib/upstash/redis.d.ts +8 -2
- package/lib/upstash/redis.d.ts.map +1 -1
- package/lib/upstash/redis.js +5 -4
- package/lib/upstash/redis.js.map +1 -1
- package/lib/util/ignore-matcher.d.ts.map +1 -1
- package/lib/util/ignore-matcher.js +3 -1
- package/lib/util/ignore-matcher.js.map +1 -1
- package/lib/util/peer.d.ts +10 -0
- package/lib/util/peer.d.ts.map +1 -0
- package/lib/util/peer.js +42 -0
- package/lib/util/peer.js.map +1 -0
- package/lib/util/telemetry/constants.d.ts.map +1 -1
- package/lib/util/telemetry/constants.js +2 -2
- package/lib/util/telemetry/constants.js.map +1 -1
- package/lib/vercel/project.d.ts +7 -1
- package/lib/vercel/project.d.ts.map +1 -1
- package/lib/vercel/project.js +28 -0
- package/lib/vercel/project.js.map +1 -1
- package/package.json +88 -74
- package/src/alchemy.ts +76 -222
- package/src/apply.ts +6 -19
- package/src/aws/account-id.ts +6 -3
- package/src/aws/bucket.ts +43 -32
- package/src/aws/ec2/security-group.ts +15 -3
- package/src/aws/function.ts +65 -39
- package/src/aws/policy-attachment.ts +10 -6
- package/src/aws/policy.ts +33 -15
- package/src/aws/queue.ts +50 -29
- package/src/aws/role.ts +37 -20
- package/src/aws/ses.ts +24 -20
- package/src/aws/ssm-parameter.ts +40 -20
- package/src/aws/table.ts +35 -17
- package/src/cloudflare/account-api-token.ts +9 -7
- package/src/cloudflare/ai-gateway.ts +37 -34
- package/src/cloudflare/api-schema.ts +33 -26
- package/src/cloudflare/api-shield.ts +15 -2
- package/src/cloudflare/astro/astro.ts +5 -1
- package/src/cloudflare/astro/plugin.ts +2 -1
- package/src/cloudflare/bindings.ts +2 -2
- package/src/cloudflare/bound.ts +1 -1
- package/src/cloudflare/bucket.ts +242 -3
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/container.ts +23 -12
- package/src/cloudflare/custom-domain.ts +2 -2
- package/src/cloudflare/d1-database.ts +11 -4
- package/src/cloudflare/dispatch-namespace.ts +10 -7
- package/src/cloudflare/hyperdrive.ts +13 -3
- package/src/cloudflare/kv-namespace.ts +25 -2
- package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
- package/src/cloudflare/miniflare/paths.ts +13 -0
- package/src/cloudflare/pipeline.ts +76 -28
- package/src/cloudflare/queue-consumer.ts +1 -1
- package/src/cloudflare/queue.ts +65 -54
- package/src/cloudflare/react-router/react-router.ts +28 -2
- package/src/cloudflare/redwood/plugin.ts +3 -2
- package/src/cloudflare/route.ts +1 -1
- package/src/cloudflare/ruleset.ts +7 -2
- package/src/cloudflare/secret.ts +20 -31
- package/src/cloudflare/secrets-store.ts +7 -3
- package/src/cloudflare/tunnel.ts +13 -2
- package/src/cloudflare/vectorize-index.ts +14 -3
- package/src/cloudflare/vite/plugin.ts +3 -2
- package/src/cloudflare/vite/vite.ts +2 -3
- package/src/cloudflare/website.ts +1 -1
- package/src/cloudflare/worker.ts +35 -23
- package/src/cloudflare/wrangler.json.ts +7 -4
- package/src/docker/container.ts +13 -1
- package/src/docker/network.ts +18 -3
- package/src/docker/volume.ts +17 -6
- package/src/fs/index.ts +0 -8
- package/src/github/client.ts +6 -2
- package/src/github/repository-environment.ts +27 -13
- package/src/neon/project.ts +20 -6
- package/src/planetscale/branch.ts +24 -13
- package/src/planetscale/database.ts +38 -17
- package/src/planetscale/password.ts +10 -3
- package/src/resource.ts +1 -10
- package/src/scope.ts +29 -38
- package/src/sentry/client-key.ts +74 -6
- package/src/sentry/project.ts +59 -6
- package/src/sentry/team.ts +55 -7
- package/src/serde.ts +0 -44
- package/src/state/d1-state-store.ts +13 -6
- package/src/state/sqlite-state-store.ts +16 -17
- package/src/stripe/card.ts +5 -2
- package/src/stripe/client.ts +10 -3
- package/src/stripe/coupon.ts +4 -3
- package/src/stripe/customer.ts +2 -2
- package/src/stripe/entitlements-feature.ts +5 -2
- package/src/stripe/file.ts +3 -2
- package/src/stripe/meter.ts +2 -2
- package/src/stripe/portal-configuration.ts +5 -2
- package/src/stripe/price.ts +3 -2
- package/src/stripe/product-feature.ts +5 -2
- package/src/stripe/product.ts +3 -2
- package/src/stripe/promotion-code.ts +3 -2
- package/src/stripe/shipping-rate.ts +4 -3
- package/src/stripe/tax-rate.ts +3 -2
- package/src/stripe/webhook.ts +4 -3
- package/src/test/vitest.ts +1 -0
- package/src/upstash/redis.ts +15 -5
- package/src/util/ignore-matcher.ts +3 -1
- package/src/util/peer.ts +53 -0
- package/src/util/telemetry/constants.ts +2 -2
- package/src/vercel/project.ts +46 -1
- package/templates/astro/_gitignore +2 -1
- package/templates/hono/README.md +19 -0
- package/templates/hono/_env +1 -0
- package/templates/hono/_env.example +1 -0
- package/templates/hono/_gitignore +34 -0
- package/templates/hono/alchemy.run.ts +22 -0
- package/templates/hono/package.json +18 -0
- package/templates/hono/src/index.ts +17 -0
- package/templates/hono/tsconfig.json +13 -0
- package/templates/hono/types/env.d.ts +16 -0
- package/templates/nuxt/_gitignore +2 -1
- package/templates/react-router/_gitignore +1 -0
- package/templates/react-router/vite.config.ts +5 -3
- package/templates/rwsdk/_gitignore +2 -3
- package/templates/sveltekit/_gitignore +2 -1
- package/templates/tanstack-start/_gitignore +2 -1
- package/templates/typescript/_gitignore +2 -1
- package/templates/vite/_gitignore +2 -1
- package/workers/cloudflare-state-store.js +69 -74
- package/workers/dofs-state-store.js +1 -1
- package/bin/bootstrap-s3.ts +0 -255
- package/lib/ai/ark.d.ts +0 -12
- package/lib/ai/ark.d.ts.map +0 -1
- package/lib/ai/ark.js +0 -87
- package/lib/ai/ark.js.map +0 -1
- package/lib/ai/astro-file.d.ts +0 -138
- package/lib/ai/astro-file.d.ts.map +0 -1
- package/lib/ai/astro-file.js +0 -158
- package/lib/ai/astro-file.js.map +0 -1
- package/lib/ai/client.d.ts +0 -51
- package/lib/ai/client.d.ts.map +0 -1
- package/lib/ai/client.js +0 -58
- package/lib/ai/client.js.map +0 -1
- package/lib/ai/css-file.d.ts +0 -132
- package/lib/ai/css-file.d.ts.map +0 -1
- package/lib/ai/css-file.js +0 -142
- package/lib/ai/css-file.js.map +0 -1
- package/lib/ai/data.d.ts +0 -152
- package/lib/ai/data.d.ts.map +0 -1
- package/lib/ai/data.js +0 -120
- package/lib/ai/data.js.map +0 -1
- package/lib/ai/document.d.ts +0 -208
- package/lib/ai/document.d.ts.map +0 -1
- package/lib/ai/document.js +0 -206
- package/lib/ai/document.js.map +0 -1
- package/lib/ai/html-file.d.ts +0 -129
- package/lib/ai/html-file.d.ts.map +0 -1
- package/lib/ai/html-file.js +0 -139
- package/lib/ai/html-file.js.map +0 -1
- package/lib/ai/index.d.ts +0 -11
- package/lib/ai/index.d.ts.map +0 -1
- package/lib/ai/index.js +0 -11
- package/lib/ai/index.js.map +0 -1
- package/lib/ai/json-file.d.ts +0 -161
- package/lib/ai/json-file.d.ts.map +0 -1
- package/lib/ai/json-file.js +0 -188
- package/lib/ai/json-file.js.map +0 -1
- package/lib/ai/typescript-file.d.ts +0 -140
- package/lib/ai/typescript-file.d.ts.map +0 -1
- package/lib/ai/typescript-file.js +0 -146
- package/lib/ai/typescript-file.js.map +0 -1
- package/lib/ai/vue-file.d.ts +0 -127
- package/lib/ai/vue-file.d.ts.map +0 -1
- package/lib/ai/vue-file.js +0 -137
- package/lib/ai/vue-file.js.map +0 -1
- package/lib/ai/yaml-file.d.ts +0 -170
- package/lib/ai/yaml-file.d.ts.map +0 -1
- package/lib/ai/yaml-file.js +0 -201
- package/lib/ai/yaml-file.js.map +0 -1
- package/lib/fs/static-astro-file.d.ts +0 -35
- package/lib/fs/static-astro-file.d.ts.map +0 -1
- package/lib/fs/static-astro-file.js +0 -40
- package/lib/fs/static-astro-file.js.map +0 -1
- package/lib/fs/static-css-file.d.ts +0 -25
- package/lib/fs/static-css-file.d.ts.map +0 -1
- package/lib/fs/static-css-file.js +0 -30
- package/lib/fs/static-css-file.js.map +0 -1
- package/lib/fs/static-html-file.d.ts +0 -32
- package/lib/fs/static-html-file.d.ts.map +0 -1
- package/lib/fs/static-html-file.js +0 -37
- package/lib/fs/static-html-file.js.map +0 -1
- package/lib/fs/static-json-file.d.ts +0 -18
- package/lib/fs/static-json-file.d.ts.map +0 -1
- package/lib/fs/static-json-file.js +0 -19
- package/lib/fs/static-json-file.js.map +0 -1
- package/lib/fs/static-text-file.d.ts +0 -13
- package/lib/fs/static-text-file.d.ts.map +0 -1
- package/lib/fs/static-text-file.js +0 -9
- package/lib/fs/static-text-file.js.map +0 -1
- package/lib/fs/static-typescript-file.d.ts +0 -20
- package/lib/fs/static-typescript-file.d.ts.map +0 -1
- package/lib/fs/static-typescript-file.js +0 -16
- package/lib/fs/static-typescript-file.js.map +0 -1
- package/lib/fs/static-vue-file.d.ts +0 -29
- package/lib/fs/static-vue-file.d.ts.map +0 -1
- package/lib/fs/static-vue-file.js +0 -34
- package/lib/fs/static-vue-file.js.map +0 -1
- package/lib/fs/static-yaml-file.d.ts +0 -23
- package/lib/fs/static-yaml-file.d.ts.map +0 -1
- package/lib/fs/static-yaml-file.js +0 -10
- package/lib/fs/static-yaml-file.js.map +0 -1
- package/lib/internal/docs/providers.d.ts +0 -34
- package/lib/internal/docs/providers.d.ts.map +0 -1
- package/lib/internal/docs/providers.js +0 -200
- package/lib/internal/docs/providers.js.map +0 -1
- package/lib/runtime/bind.d.ts +0 -25
- package/lib/runtime/bind.d.ts.map +0 -1
- package/lib/runtime/bind.js +0 -76
- package/lib/runtime/bind.js.map +0 -1
- package/lib/runtime/global.d.ts +0 -8
- package/lib/runtime/global.d.ts.map +0 -1
- package/lib/runtime/global.js +0 -3
- package/lib/runtime/global.js.map +0 -1
- package/lib/runtime/plugin.d.ts +0 -35
- package/lib/runtime/plugin.d.ts.map +0 -1
- package/lib/runtime/plugin.js +0 -134
- package/lib/runtime/plugin.js.map +0 -1
- package/lib/runtime/shims.d.ts +0 -6
- package/lib/runtime/shims.d.ts.map +0 -1
- package/lib/runtime/shims.js +0 -27
- package/lib/runtime/shims.js.map +0 -1
- package/lib/runtime/state.d.ts +0 -5
- package/lib/runtime/state.d.ts.map +0 -1
- package/lib/runtime/state.js +0 -4
- package/lib/runtime/state.js.map +0 -1
- package/lib/web/astro.d.ts +0 -148
- package/lib/web/astro.d.ts.map +0 -1
- package/lib/web/astro.js +0 -419
- package/lib/web/astro.js.map +0 -1
- package/lib/web/shadcn-component.d.ts +0 -30
- package/lib/web/shadcn-component.d.ts.map +0 -1
- package/lib/web/shadcn-component.js +0 -25
- package/lib/web/shadcn-component.js.map +0 -1
- package/lib/web/shadcn.d.ts +0 -98
- package/lib/web/shadcn.d.ts.map +0 -1
- package/lib/web/shadcn.js +0 -102
- package/lib/web/shadcn.js.map +0 -1
- package/lib/web/tailwind.d.ts +0 -65
- package/lib/web/tailwind.d.ts.map +0 -1
- package/lib/web/tailwind.js +0 -98
- package/lib/web/tailwind.js.map +0 -1
- package/lib/web/vite.d.ts +0 -96
- package/lib/web/vite.d.ts.map +0 -1
- package/lib/web/vite.js +0 -232
- package/lib/web/vite.js.map +0 -1
- package/lib/web/vitepress/config.d.ts +0 -12
- package/lib/web/vitepress/config.d.ts.map +0 -1
- package/lib/web/vitepress/config.js +0 -33
- package/lib/web/vitepress/config.js.map +0 -1
- package/lib/web/vitepress/custom-theme.d.ts +0 -174
- package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
- package/lib/web/vitepress/custom-theme.js +0 -337
- package/lib/web/vitepress/custom-theme.js.map +0 -1
- package/lib/web/vitepress/dependencies.d.ts +0 -13
- package/lib/web/vitepress/dependencies.d.ts.map +0 -1
- package/lib/web/vitepress/dependencies.js +0 -37
- package/lib/web/vitepress/dependencies.js.map +0 -1
- package/lib/web/vitepress/home-page.d.ts +0 -247
- package/lib/web/vitepress/home-page.d.ts.map +0 -1
- package/lib/web/vitepress/home-page.js +0 -146
- package/lib/web/vitepress/home-page.js.map +0 -1
- package/lib/web/vitepress/index.d.ts +0 -6
- package/lib/web/vitepress/index.d.ts.map +0 -1
- package/lib/web/vitepress/index.js +0 -6
- package/lib/web/vitepress/index.js.map +0 -1
- package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
- package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
- package/lib/web/vitepress/process-front-matter-files.js +0 -73
- package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
- package/lib/web/vitepress/vitepress.d.ts +0 -75
- package/lib/web/vitepress/vitepress.d.ts.map +0 -1
- package/lib/web/vitepress/vitepress.js +0 -254
- package/lib/web/vitepress/vitepress.js.map +0 -1
- package/src/ai/ark.ts +0 -118
- package/src/ai/astro-file.ts +0 -270
- package/src/ai/client.ts +0 -117
- package/src/ai/css-file.ts +0 -247
- package/src/ai/data.ts +0 -221
- package/src/ai/document.ts +0 -367
- package/src/ai/html-file.ts +0 -244
- package/src/ai/index.ts +0 -10
- package/src/ai/json-file.ts +0 -325
- package/src/ai/typescript-file.ts +0 -259
- package/src/ai/vue-file.ts +0 -242
- package/src/ai/yaml-file.ts +0 -328
- package/src/fs/static-astro-file.ts +0 -45
- package/src/fs/static-css-file.ts +0 -35
- package/src/fs/static-html-file.ts +0 -42
- package/src/fs/static-json-file.ts +0 -38
- package/src/fs/static-text-file.ts +0 -23
- package/src/fs/static-typescript-file.ts +0 -37
- package/src/fs/static-vue-file.ts +0 -39
- package/src/fs/static-yaml-file.ts +0 -33
- package/src/internal/docs/providers.ts +0 -286
- package/src/runtime/bind.ts +0 -95
- package/src/runtime/global.ts +0 -10
- package/src/runtime/plugin.ts +0 -163
- package/src/runtime/shims.js +0 -34
- package/src/runtime/state.ts +0 -9
- package/src/web/astro.ts +0 -643
- package/src/web/shadcn-component.ts +0 -72
- package/src/web/shadcn.ts +0 -221
- package/src/web/tailwind.ts +0 -167
- package/src/web/vite.ts +0 -407
- package/src/web/vitepress/config.ts +0 -50
- package/src/web/vitepress/custom-theme.ts +0 -514
- package/src/web/vitepress/dependencies.ts +0 -69
- package/src/web/vitepress/home-page.ts +0 -378
- package/src/web/vitepress/index.ts +0 -5
- package/src/web/vitepress/process-front-matter-files.ts +0 -107
- package/src/web/vitepress/vitepress.ts +0 -372
- package/templates/sveltekit/bun.lock +0 -1099
package/src/ai/document.ts
DELETED
|
@@ -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
|
-
}
|
package/src/ai/html-file.ts
DELETED
|
@@ -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";
|