From db11529ebe4cccbedcebb7743521c05b7ec38b76 Mon Sep 17 00:00:00 2001 From: Nicholas Ly Date: Thu, 25 Jul 2024 15:36:25 -0500 Subject: [PATCH] feat: ai chatbot --- .env.example | 3 + package-lock.json | 791 +++++++++++++++++++++++++++++- package.json | 8 +- public/favicon.ico | Bin 25931 -> 15406 bytes public/memoji.png | Bin 0 -> 69606 bytes src/app/layout.tsx | 7 +- src/app/page.tsx | 6 +- src/components/chat.tsx | 120 +++++ src/components/message-editor.tsx | 54 ++ src/components/message-feed.tsx | 49 ++ src/components/message-header.tsx | 19 + src/components/messages.tsx | 19 + src/lib/ai.ts | 56 +++ src/styles/globals.css | 13 + tailwind.config.ts | 8 +- 15 files changed, 1131 insertions(+), 22 deletions(-) create mode 100644 .env.example create mode 100644 public/memoji.png create mode 100644 src/components/chat.tsx create mode 100644 src/components/message-editor.tsx create mode 100644 src/components/message-feed.tsx create mode 100644 src/components/message-header.tsx create mode 100644 src/components/messages.tsx create mode 100644 src/lib/ai.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bcae28a --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY="" +UPSTASH_REDIS_REST_URL="" +UPSTASH_REDIS_REST_TOKEN="" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 327c497..17883c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,15 @@ "name": "nicholasly.com", "version": "0.1.0", "dependencies": { + "@ai-sdk/openai": "^0.0.39", + "@upstash/ratelimit": "^2.0.1", + "@upstash/redis": "^1.33.0", + "ai": "^3.2.35", + "lucide-react": "^0.414.0", "next": "14.2.5", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "sonner": "^1.5.0" }, "devDependencies": { "@types/node": "^20", @@ -25,6 +31,186 @@ "typescript": "^5" } }, + "node_modules/@ai-sdk/openai": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-0.0.39.tgz", + "integrity": "sha512-UNkT7394/aG7s2VRY53mRqKlv2tBBuRGvIOuqMcpgfVquf+NRYWsDWAYM4UxqcK5uigSKk4uV/lIJX+fRUXszg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "0.0.13", + "@ai-sdk/provider-utils": "1.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.13.tgz", + "integrity": "sha512-RBstpG/3RqVBBJgTvjZpou/+1fNQMDIwB9enqQPXqr0MoCrJHscLD2Zsfr6cKM5HFfY1D4KhdSPTycCDebVGlQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.4.tgz", + "integrity": "sha512-2TldHn54+HrvVHMCos9lrSMcDIp3cgnpphpYT/95RXcIzcGwAFM5MioDWnsrki3noplU5pVld6ylD3Vu/Xt3Vw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "0.0.13", + "eventsource-parser": "1.1.2", + "nanoid": "3.3.6", + "secure-json-parse": "2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/provider-utils/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/@ai-sdk/react": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-0.0.28.tgz", + "integrity": "sha512-wOYtnXKGWjgO8jEX059GFAa8Jys2vrA8CUKxvfO1dD3GTyb7oiRZ9eVjtGEM5wQ2fepX2xIQj8oDxJh0EjKiNA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "1.0.4", + "@ai-sdk/ui-utils": "0.0.19", + "swr": "2.2.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19", + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/solid": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/solid/-/solid-0.0.21.tgz", + "integrity": "sha512-5uF4AGy2jk9j8sMu2cebfWregaXiebV1N/l/5wGW01Y+7NvGNHUuVC/aSVcF5BvXGZiKjwkVvoU7h5VQIq+IZw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/ui-utils": "0.0.19" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "solid-js": "^1.7.7" + }, + "peerDependenciesMeta": { + "solid-js": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/svelte": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/svelte/-/svelte-0.0.22.tgz", + "integrity": "sha512-ij5rNA+QSSstcOit+p5EWvyujz368u73K6QrwCpMPMEUNoyxJbazVdU79PlMviFHRsrjA9I7WmEDIXH/YBKZCQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "1.0.4", + "@ai-sdk/ui-utils": "0.0.19", + "sswr": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "svelte": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-0.0.19.tgz", + "integrity": "sha512-nLCUNoQ4hY+v/5pMLz7mIe8ZUW6tR644Zaqh9gg8ScKVfc3EMvyxJ/AoAjcgD00iXOmbT1/xTsF6TkXRGExZ1Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "1.0.4", + "secure-json-parse": "2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/vue": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/@ai-sdk/vue/-/vue-0.0.23.tgz", + "integrity": "sha512-01zCo6mJJSPwDYjjUvSqWebGAjqUNOb6qzd/ZVPB77mW2XEYVXxBoOSBv5ARPIH3cRwovj7YQVvgh9oKGgE+3A==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "1.0.4", + "@ai-sdk/ui-utils": "0.0.19", + "swrv": "1.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vue": "^3.3.4" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -38,6 +224,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "license": "MIT", + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -187,7 +400,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -202,7 +414,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -212,7 +423,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -222,14 +432,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -434,6 +642,15 @@ "node": ">= 8" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -468,6 +685,19 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT", + "peer": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -654,11 +884,163 @@ "dev": true, "license": "ISC" }, + "node_modules/@upstash/core-analytics": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@upstash/core-analytics/-/core-analytics-0.0.10.tgz", + "integrity": "sha512-7qJHGxpQgQr9/vmeS1PktEwvNAF7TI4iJDi8Pu2CFZ9YUGHZH4fOP5TfYlZ4aVxfopnELiE4BS4FBjyK7V1/xQ==", + "license": "MIT", + "dependencies": { + "@upstash/redis": "^1.28.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@upstash/ratelimit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@upstash/ratelimit/-/ratelimit-2.0.1.tgz", + "integrity": "sha512-J+0hlkvWUjlVrjcBQhWx7gbaUGsvFF59i+GAx7YQk8L0E0MQ93xzCPu02uaXhGDJGkxiar7nRRPqj3hs+CdAJg==", + "license": "MIT", + "dependencies": { + "@upstash/core-analytics": "^0.0.10" + } + }, + "node_modules/@upstash/redis": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.33.0.tgz", + "integrity": "sha512-5WOilc7AE0ITAdE3NCyMwgOq1n3RHcqW0OfmbotiAyfA+QAEe1R7kXin8L/Yladgdc5lkA0GcYyewqKfAw53jQ==", + "license": "MIT", + "dependencies": { + "crypto-js": "^4.2.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.34.tgz", + "integrity": "sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.34", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT", + "peer": true + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.34.tgz", + "integrity": "sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.4.34", + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.34.tgz", + "integrity": "sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.34", + "@vue/compiler-dom": "3.4.34", + "@vue/compiler-ssr": "3.4.34", + "@vue/shared": "3.4.34", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.39", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT", + "peer": true + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.34.tgz", + "integrity": "sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.4.34", + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.34.tgz", + "integrity": "sha512-ua+Lo+wBRlBEX9TtgPOShE2JwIO7p6BTZ7t1KZVPoaBRfqbC7N3c8Mpzicx173fXxx5VXeU6ykiHo7WgLzJQDA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.34.tgz", + "integrity": "sha512-PXhkiRPwcPGJ1BnyBZFI96GfInCVskd0HPNIAZn7i3YOmLbtbTZpB7/kDTwC1W7IqdGPkTVC63IS7J2nZs4Ebg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.4.34", + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.34.tgz", + "integrity": "sha512-dXqIe+RqFAK2Euak4UsvbIupalrhc67OuQKpD7HJ3W2fv8jlqvI7szfBCsAEcE8o/wyNpkloxB6J8viuF/E3gw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.4.34", + "@vue/runtime-core": "3.4.34", + "@vue/shared": "3.4.34", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.34.tgz", + "integrity": "sha512-GeyEUfMVRZMD/mZcNONEqg7MiU10QQ1DB3O/Qr6+8uXpbwdlmVgQ5Qs1/ZUAFX1X2UUtqMoGrDRbxdWfOJFT7Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.34", + "@vue/shared": "3.4.34" + }, + "peerDependencies": { + "vue": "3.4.34" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.34.tgz", + "integrity": "sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==", + "license": "MIT", + "peer": true + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -677,6 +1059,73 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/ai": { + "version": "3.2.35", + "resolved": "https://registry.npmjs.org/ai/-/ai-3.2.35.tgz", + "integrity": "sha512-H4/gAuum6kL4NP22ZoBPKzp9/uCLUUW6r6L0+ll1WihgbNBUhH2ahxDG+y4p7H7DJOEoUwHlqQ9u/1evPxXtDQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "0.0.13", + "@ai-sdk/provider-utils": "1.0.4", + "@ai-sdk/react": "0.0.28", + "@ai-sdk/solid": "0.0.21", + "@ai-sdk/svelte": "0.0.22", + "@ai-sdk/ui-utils": "0.0.19", + "@ai-sdk/vue": "0.0.23", + "@opentelemetry/api": "1.9.0", + "eventsource-parser": "1.1.2", + "json-schema": "0.4.0", + "jsondiffpatch": "0.6.0", + "nanoid": "3.3.6", + "secure-json-parse": "2.7.0", + "zod-to-json-schema": "3.22.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "openai": "^4.42.0", + "react": "^18 || ^19", + "sswr": "^2.1.0", + "svelte": "^3.0.0 || ^4.0.0", + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + }, + "react": { + "optional": true + }, + "sswr": { + "optional": true + }, + "svelte": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/ai/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1165,6 +1614,20 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1217,6 +1680,26 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1234,7 +1717,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -1392,6 +1874,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1399,6 +1891,12 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1460,6 +1958,19 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -2087,6 +2598,16 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2097,6 +2618,15 @@ "node": ">=0.10.0" } }, + "node_modules/eventsource-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", + "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2941,6 +3471,16 @@ "node": ">=8" } }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -3161,6 +3701,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3188,6 +3734,35 @@ "json5": "lib/cli.js" } }, + "node_modules/jsondiffpatch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", + "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", + "license": "MIT", + "dependencies": { + "@types/diff-match-patch": "^1.0.36", + "chalk": "^5.3.0", + "diff-match-patch": "^1.0.5" + }, + "bin": { + "jsondiffpatch": "bin/jsondiffpatch.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/jsondiffpatch/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -3265,6 +3840,13 @@ "dev": true, "license": "MIT" }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT", + "peer": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3307,6 +3889,32 @@ "dev": true, "license": "ISC" }, + "node_modules/lucide-react": { + "version": "0.414.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.414.0.tgz", + "integrity": "sha512-Krr/MHg9AWoJc52qx8hyJ64X9++JNfS1wjaJviLM1EP/68VNB7Tv0VMldLCB1aUe6Ka9QxURPhQm/eB6cqOM3A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0", + "peer": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3779,6 +4387,18 @@ "node": ">=8" } }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -3832,7 +4452,6 @@ "version": "8.4.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4383,6 +5002,12 @@ "loose-envify": "^1.1.0" } }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -4495,6 +5120,16 @@ "node": ">=8" } }, + "node_modules/sonner": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", + "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -4504,6 +5139,18 @@ "node": ">=0.10.0" } }, + "node_modules/sswr": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sswr/-/sswr-2.1.0.tgz", + "integrity": "sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==", + "license": "MIT", + "dependencies": { + "swrev": "^4.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -4818,6 +5465,80 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svelte": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.18.tgz", + "integrity": "sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/svelte/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/swr": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "license": "MIT", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/swrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/swrev/-/swrev-4.0.0.tgz", + "integrity": "sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==", + "license": "MIT" + }, + "node_modules/swrv": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz", + "integrity": "sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==", + "license": "Apache-2.0", + "peerDependencies": { + "vue": ">=3.2.26 < 4" + } + }, "node_modules/tailwindcss": { "version": "3.4.6", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", @@ -5055,7 +5776,7 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5098,6 +5819,15 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5105,6 +5835,28 @@ "dev": true, "license": "MIT" }, + "node_modules/vue": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.34.tgz", + "integrity": "sha512-VZze05HWlA3ItreQ/ka7Sx7PoD0/3St8FEiSlSTVgb6l4hL+RjtP2/8g5WQBzZgyf8WG2f+g1bXzC7zggLhAJA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.4.34", + "@vue/compiler-sfc": "3.4.34", + "@vue/runtime-dom": "3.4.34", + "@vue/server-renderer": "3.4.34", + "@vue/shared": "3.4.34" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5347,6 +6099,25 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz", + "integrity": "sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.22.4" + } } } } diff --git a/package.json b/package.json index 3219837..331f8f0 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,15 @@ "format": "npx prettier . --write" }, "dependencies": { + "@ai-sdk/openai": "^0.0.39", + "@upstash/ratelimit": "^2.0.1", + "@upstash/redis": "^1.33.0", + "ai": "^3.2.35", + "lucide-react": "^0.414.0", "next": "14.2.5", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "sonner": "^1.5.0" }, "devDependencies": { "@types/node": "^20", diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..c25c8a3e2c464024047651c0d13bc0cae2e0a60a 100644 GIT binary patch literal 15406 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 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/public/memoji.png b/public/memoji.png new file mode 100644 index 0000000000000000000000000000000000000000..2e19a36c98f967b9f847dab908f8a8c543002f0d GIT binary patch literal 69606 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 a8UG&yX_?>LjICt=0000) { return ( + {children} ); diff --git a/src/app/page.tsx b/src/app/page.tsx index 41237d8..cb71211 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,7 +1,9 @@ +import Chat from "@/components/chat"; + export default function Home() { return ( -

-

Hello world!

+
+
); } diff --git a/src/components/chat.tsx b/src/components/chat.tsx new file mode 100644 index 0000000..d5a054e --- /dev/null +++ b/src/components/chat.tsx @@ -0,0 +1,120 @@ +"use client"; + +import { continueConversation } from "@/lib/ai"; +import { CoreMessage } from "ai"; +import { readStreamableValue } from "ai/rsc"; +import { ChangeEvent, FormEvent, useEffect, useRef, useState } from "react"; +import { toast } from "sonner"; +import MessageHeader from "./message-header"; +import MessageFeed from "./message-feed"; +import MessageForm from "./message-editor"; + +export default function Chat() { + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(""); + const [loading, setLoading] = useState(false); + const scrollAnchor = useRef(null); + + /** + * Updates the message editor `textarea` element height to fit the content of the element. + * If the `reset` option is set to `true`, the `textarea` content and user input state will be reset. + */ + const resizeInput = ({ reset }: { reset: boolean }) => { + const editor = document.getElementById("editor") as HTMLTextAreaElement; + + if (reset) { + setInput(""); + editor.value = ""; + } + + editor.style.height = "auto"; + editor.style.height = editor.scrollHeight + "px"; + }; + + /** + * Updates the user input state and resizes the message editor. + * @param event A React `textarea` change event. + */ + const handleChange = (event: ChangeEvent) => { + setInput(event.target.value); + resizeInput({ reset: false }); + }; + + /** + * Form submission handler that resets the user input state and appends a user message to the conversation. + * @param event A React `form` event. + */ + const handleSubmit = async (event?: FormEvent) => { + event?.preventDefault(); + + const newMessages: CoreMessage[] = [ + ...messages, + { content: input, role: "user" }, + ]; + + setLoading(true); + setMessages(newMessages); + resizeInput({ reset: true }); + + try { + const result = await continueConversation(newMessages); + + for await (const content of readStreamableValue(result)) { + setMessages([ + ...newMessages, + { + role: "assistant", + content: content as string, + }, + ]); + } + } catch (error) { + handleMessageError(error); + } finally { + setLoading(false); + } + }; + + // Automatically scrolls message feed on changes so that new messages are visible. + useEffect(() => { + scrollAnchor.current?.scrollIntoView({ behavior: "smooth" }); + }, [messages]); + + return ( +
+ + + +
+ ); +} + +/** + * Displays a specific toast message for an expected error. + * @param error The error object caught by a `try-catch`. + */ +function handleMessageError(error: unknown) { + const isError = error instanceof Error; + if (!isError) throw error; + + let message: string; + let description: string; + + switch (error.message) { + case "TOO_MANY_REQUESTS": + message = "Rate limit exceeded!"; + description = "Please wait a few moments then try again."; + break; + default: + message = "Uh oh!"; + description = "Something went wrong!"; + break; + } + + toast.error(message, { description }); +} diff --git a/src/components/message-editor.tsx b/src/components/message-editor.tsx new file mode 100644 index 0000000..9f7181c --- /dev/null +++ b/src/components/message-editor.tsx @@ -0,0 +1,54 @@ +import { ArrowUpIcon } from "lucide-react"; +import { ChangeEvent, FormEvent } from "react"; + +interface MessageFormProps { + input: string; + handleChange: (event: ChangeEvent) => void; + handleSubmit: (event?: FormEvent) => Promise; + loading: boolean; +} + +export default function MessageForm({ + input, + handleChange, + handleSubmit, + loading, +}: MessageFormProps) { + return ( +
+
+