From 228834667b8e8f7952d52d590bb7190d6dda6256 Mon Sep 17 00:00:00 2001 From: Zach Khong Date: Tue, 11 Jun 2024 14:48:32 +0800 Subject: [PATCH] added in more endpoints and general tech inits with axios, swr and zustand --- bun.lockb | Bin 347072 -> 62512 bytes packages/akeru-server/package.json | 1 + .../akeru-server/scripts/createHumanUser.ts | 51 ++++++ .../assistant/assistantController.ts | 37 +++- .../controllers/thread/threadController.ts | 6 +- .../thread/threadControllet.test.ts | 3 + .../application/controllers/userController.ts | 32 ++++ .../application/services/assistantService.ts | 31 +++- .../akeru-server/src/core/domain/roles.ts | 1 + .../akeru-server/src/core/domain/thread.ts | 1 + packages/akeru-server/src/index.ts | 2 + .../src/infrastructure/config/redisConfig.ts | 2 +- packages/app-akeru/package.json | 7 +- packages/app-akeru/pnpm-lock.yaml | 171 ++++++++++++++++++ .../assistants-list/assistants-list.tsx | 22 ++- .../assistants-list/use-assistant.tsx | 19 +- .../app-akeru/src/components/ui/combobox.tsx | 74 ++++++++ .../app-akeru/src/components/ui/command.tsx | 155 ++++++++++++++++ .../app-akeru/src/components/ui/dialog.tsx | 122 +++++++++++++ packages/app-akeru/src/lib/axios.ts | 14 ++ 20 files changed, 736 insertions(+), 15 deletions(-) create mode 100644 packages/akeru-server/scripts/createHumanUser.ts create mode 100644 packages/app-akeru/src/components/ui/combobox.tsx create mode 100644 packages/app-akeru/src/components/ui/command.tsx create mode 100644 packages/app-akeru/src/components/ui/dialog.tsx create mode 100644 packages/app-akeru/src/lib/axios.ts diff --git a/bun.lockb b/bun.lockb index c10d524e797a2017b028092ce9ba5d5c1f987adf..ea54ea5afd70c27024a77be2993b7034cea1bd9a 100755 GIT binary patch delta 15128 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 literal 347072 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 diff --git a/packages/akeru-server/package.json b/packages/akeru-server/package.json index 5a9a5ba..de9fde6 100644 --- a/packages/akeru-server/package.json +++ b/packages/akeru-server/package.json @@ -8,6 +8,7 @@ }, "dependencies": { "@elysiajs/bearer": "^1.0.2", + "@elysiajs/cors": "^1.0.2", "@elysiajs/stream": "^1.0.2", "@elysiajs/swagger": "^1.0.4", "dayjs": "^1.11.10", diff --git a/packages/akeru-server/scripts/createHumanUser.ts b/packages/akeru-server/scripts/createHumanUser.ts new file mode 100644 index 0000000..f8d7022 --- /dev/null +++ b/packages/akeru-server/scripts/createHumanUser.ts @@ -0,0 +1,51 @@ +import { + createApiToken, + createHumanUser, +} from "@/core/application/controllers/userController"; +import { createAssistant } from "@/core/application/services/assistantService"; +import { createThread } from "@/core/application/services/threadService"; +import { ulid } from "ulid"; + +async function createHumanUserWithApiKey() { + const userData = { + name: "Mr. Akeru Human User", + email: "thisistesting@akeru.com", + }; + + // Creating the human user for id + const userId = await createHumanUser(userData); + if (!userId) { + console.error("Failed to create super admin user"); + return; + } + + // creating user bearer token + const apiKey = await createApiToken(userId); + if (!apiKey) { + console.error("Failed to create API key for super admin user"); + return; + } + + // creating assistants associated with the user, creating three assistants + const { id: id_1 } = await createAssistant({ userId, id: ulid(), model: "gpt-4", name: "Homework assistant", fileIds: [], tools: [], instruction: "You are a homework helper. Do not answer irrelevant questions." }); + const { id: id_2 } = await createAssistant({ userId, id: ulid(), model: "gpt-4", name: "Tropical Plant Expert", fileIds: [], tools: [], instruction: "You specialise in tropical plants. Do not answer irrelevant questions." }); + const { id: id_3 } = await createAssistant({ userId, id: ulid(), model: "gpt-4", name: "Marine Biologist", fileIds: [], tools: [], instruction: "You specialise in Marine Biology. Do not answer irrelevant questions." }); + + // creating a few threads associated with said assistants + await createThread({ id: ulid(), createdBy: userId, participants: [], messageIds: [], name: 'Homework on Science' }) + await createThread({ id: ulid(), createdBy: userId, participants: [], messageIds: [], name: 'What are fishes?' }) + await createThread({ id: ulid(), createdBy: userId, participants: [], messageIds: [], name: 'Why do plants commonly die?' }) + + console.log(`human user created with ID: ${userId}`); + console.log(`API key for human user: ${apiKey}`); + + console.log(`assistant_id 1 created with ID: ${id_1}`); + console.log(`assistant_id 2 created with ID: ${id_2}`); + console.log(`assistant_id 3 created with ID: ${id_3}`); + + process.exit(); +} + +createHumanUserWithApiKey().catch((err) => { + console.error("Error creating super admin user with API key:", err); +}); diff --git a/packages/akeru-server/src/core/application/controllers/assistant/assistantController.ts b/packages/akeru-server/src/core/application/controllers/assistant/assistantController.ts index 2c0ec11..735a939 100644 --- a/packages/akeru-server/src/core/application/controllers/assistant/assistantController.ts +++ b/packages/akeru-server/src/core/application/controllers/assistant/assistantController.ts @@ -6,7 +6,10 @@ import { assignRole, createUser, } from "@/core/application/services/userService"; -import { createAssistant } from "@/core/application/services/assistantService"; +import { + createAssistant, + getAssistantData, +} from "@/core/application/services/assistantService"; import { AuthMiddleware } from "../../middlewares/authorizationMiddleware"; import bearer from "@elysiajs/bearer"; @@ -35,7 +38,7 @@ assistants.post( name, fileIds: [], tools: [], - instruction: body.instruction + instruction: body.instruction, }); return { @@ -48,8 +51,36 @@ assistants.post( body: t.Object({ name: t.String(), model: t.Literal("gpt-4"), // add more models here - instruction: t.String() + instruction: t.String(), }), beforeHandle: AuthMiddleware(["create_assistant", "*"]), } ); + +/** + * Based on the query for the endpoint fetch the appropriate details about the users assistants + */ +assistants.get( + "/assistant", + async ({ query, bearer }) => { + console.info("hit") + // only support ALL query for now + const decodedToken = await parseToken(bearer!); + if (!decodedToken) return; + + const { userId } = decodedToken; + + const assistantData = await getAssistantData({ + query: query.query, + userId: userId, + }); + + return assistantData; + }, + { + query: t.Object({ + query: t.Literal("ALL"), + }), + beforeHandle: AuthMiddleware(["view_assistants", "*"]), + } +); diff --git a/packages/akeru-server/src/core/application/controllers/thread/threadController.ts b/packages/akeru-server/src/core/application/controllers/thread/threadController.ts index cafc837..f8961e4 100644 --- a/packages/akeru-server/src/core/application/controllers/thread/threadController.ts +++ b/packages/akeru-server/src/core/application/controllers/thread/threadController.ts @@ -22,13 +22,14 @@ export const threads = new Elysia<"/thread">().use(bearer()); threads.post( "/thread", - async ({ bearer }) => { + async ({ bearer, body }) => { const decodedToken = await parseToken(bearer!); if (decodedToken) { const { userId } = decodedToken; // // Create a new thread const threadId = await createThread({ + name: body.thread_name, id: ulid(), // Generate a unique ID for the thread createdBy: userId, participants: [], // Initialize the participants list @@ -44,6 +45,9 @@ threads.post( } }, { + body: t.Object({ + thread_name: t.String() + }), beforeHandle: AuthMiddleware(["create_thread", "*"]), }, ); diff --git a/packages/akeru-server/src/core/application/controllers/thread/threadControllet.test.ts b/packages/akeru-server/src/core/application/controllers/thread/threadControllet.test.ts index 4135119..2209b0d 100644 --- a/packages/akeru-server/src/core/application/controllers/thread/threadControllet.test.ts +++ b/packages/akeru-server/src/core/application/controllers/thread/threadControllet.test.ts @@ -14,6 +14,9 @@ describe.only("threadController", async () => { "Content-Type": "application/json", }, method: "POST", + body: JSON.stringify({ + thread_name: "Akeru thread", + }), }); const response = await app.handle(request); diff --git a/packages/akeru-server/src/core/application/controllers/userController.ts b/packages/akeru-server/src/core/application/controllers/userController.ts index c8ae55f..56302e6 100644 --- a/packages/akeru-server/src/core/application/controllers/userController.ts +++ b/packages/akeru-server/src/core/application/controllers/userController.ts @@ -35,6 +35,38 @@ export async function createSuperAdmin( } } +/** + * Creates a new user with a random ID and assigns them the "super admin" role. + * Also creates the user in Redis. + * WARNING: This function should only be used in seeding scripts. + * @param {Object} userData - The data of the user to create. + * @returns {Promise} A promise that resolves to the ID of the new user if the user was created and assigned the role successfully, or null otherwise. + */ +export async function createHumanUser( + userData: Object +): Promise { + try { + const userId = ulid(); + const userCreated = await createUser(userId, userData); + if (!userCreated) { + return null; + } + + const roleAssigned = await assignRole(userId, "user"); + if (!roleAssigned) { + return null; + } + + // Create the user in Redis + await redis.set(`user:${userId}`, JSON.stringify(userData)); + + return userId; + } catch (err) { + console.error("Error creating super admin:", err); + return null; + } +} + /** * Creates a new API token for a user. * WARNING: This function should only be used in seeding scripts. diff --git a/packages/akeru-server/src/core/application/services/assistantService.ts b/packages/akeru-server/src/core/application/services/assistantService.ts index a6f0969..a09c7aa 100644 --- a/packages/akeru-server/src/core/application/services/assistantService.ts +++ b/packages/akeru-server/src/core/application/services/assistantService.ts @@ -1,4 +1,5 @@ import type { Assistant } from "@/core/domain/assistant"; +import { User } from "@/core/domain/user"; import { redis } from "@/infrastructure/adapters/redisAdapter"; /** @@ -15,7 +16,10 @@ export async function createAssistant(args: Assistant & { userId: string }) { const pipeline = redis.pipeline(); // Store the assistant data - pipeline.set(`assistant:${id}`, JSON.stringify({ tools, model, name, instruction })); + pipeline.set( + `assistant:${id}`, + JSON.stringify({ tools, model, name, instruction, id }) + ); // Store the relationship between the assistant and the user pipeline.sadd(`user:${userId}:assistants`, id); @@ -31,11 +35,30 @@ export async function createAssistant(args: Assistant & { userId: string }) { } // Parse the assistant data from JSON - return JSON.parse(assistantData); + return JSON.parse(assistantData) as Assistant; } -export async function getAssistantData(assistant_id: Assistant["id"]) { - const assistantData = await redis.get(`assistant:${assistant_id}`); +export async function getAssistantData(args: { + query: Assistant["id"] | "ALL"; + userId: User["id"]; +}) { + const { query, userId } = args; + + // if query is ALL then fetch all relevant assistant data + if (query === "ALL") { + const allAssistantData = await redis.smembers(`user:${userId}:assistants`); + return Promise.all( + allAssistantData.map(async (assistantId) => { + const assistantData = await redis.get(`assistant:${assistantId}`); + if (!assistantData) { + throw new Error("Failed to get assistant"); + } + return JSON.parse(assistantData) as Assistant; + }) + ); + } + + const assistantData = await redis.get(`user:${userId}:assistant:${query}`); if (!assistantData) { throw new Error("Failed to get assistant"); } diff --git a/packages/akeru-server/src/core/domain/roles.ts b/packages/akeru-server/src/core/domain/roles.ts index bc2868d..3c8e3cb 100644 --- a/packages/akeru-server/src/core/domain/roles.ts +++ b/packages/akeru-server/src/core/domain/roles.ts @@ -17,6 +17,7 @@ const roles: Record = { "view_own_threads", "create_message_in_own_thread", "create_assistant", + "view_assistants" ], }, assistant: { diff --git a/packages/akeru-server/src/core/domain/thread.ts b/packages/akeru-server/src/core/domain/thread.ts index d912303..41b309f 100644 --- a/packages/akeru-server/src/core/domain/thread.ts +++ b/packages/akeru-server/src/core/domain/thread.ts @@ -2,6 +2,7 @@ import { User } from "./user"; export type Thread = { id: string; // The ID of the thread + name: string; createdBy: string; // The ID of the user who created the thread startDate?: Date; // The start date of the thread participants: User['id'][]; // The IDs of the users participating in the thread diff --git a/packages/akeru-server/src/index.ts b/packages/akeru-server/src/index.ts index c521169..688e1f9 100644 --- a/packages/akeru-server/src/index.ts +++ b/packages/akeru-server/src/index.ts @@ -3,6 +3,7 @@ import { Elysia } from "elysia"; import { threads } from "@/core/application/controllers/thread/threadController"; import { assistants } from "@/core/application/controllers/assistant/assistantController"; import { users } from "./core/application/controllers/user/userController"; +import cors from "@elysiajs/cors"; export const name = "Akeru"; @@ -17,6 +18,7 @@ export const healthCheck = async () => { }; export const app = new Elysia() + .use(cors()) .use(assistants) .use(threads) .use(users) diff --git a/packages/akeru-server/src/infrastructure/config/redisConfig.ts b/packages/akeru-server/src/infrastructure/config/redisConfig.ts index b9dd9a0..d8ccbb9 100644 --- a/packages/akeru-server/src/infrastructure/config/redisConfig.ts +++ b/packages/akeru-server/src/infrastructure/config/redisConfig.ts @@ -5,5 +5,5 @@ export const redisConfig = { ? { password: process.env.REDIS_PASSWORD } : {}), // Redis password db: process.env.REDIS_DB ? parseInt(process.env.REDIS_DB) : 0, // Redis DB - tls: {}, + // tls: {}, }; diff --git a/packages/app-akeru/package.json b/packages/app-akeru/package.json index 828d91f..b2ff315 100644 --- a/packages/app-akeru/package.json +++ b/packages/app-akeru/package.json @@ -9,14 +9,17 @@ "lint": "next lint" }, "dependencies": { + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-menubar": "^1.0.4", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "axios": "^1.7.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "cmdk": "^1.0.0", "geist": "^1.3.0", "lucide-react": "^0.378.0", "next": "14.2.3", @@ -24,8 +27,10 @@ "react": "^18", "react-dom": "^18", "sonner": "^1.4.41", + "swr": "^2.2.5", "tailwind-merge": "^2.3.0", - "tailwindcss-animate": "^1.0.7" + "tailwindcss-animate": "^1.0.7", + "zustand": "^4.5.2" }, "devDependencies": { "@types/node": "^20", diff --git a/packages/app-akeru/pnpm-lock.yaml b/packages/app-akeru/pnpm-lock.yaml index 237b6d8..5d031f2 100644 --- a/packages/app-akeru/pnpm-lock.yaml +++ b/packages/app-akeru/pnpm-lock.yaml @@ -1,6 +1,9 @@ lockfileVersion: '6.0' dependencies: + '@radix-ui/react-dialog': + specifier: ^1.0.5 + version: 1.0.5(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) '@radix-ui/react-menubar': specifier: ^1.0.4 version: 1.0.4(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) @@ -19,12 +22,18 @@ dependencies: '@radix-ui/react-slot': specifier: ^1.0.2 version: 1.0.2(@types/react@18.3.2)(react@18.0.0) + axios: + specifier: ^1.7.2 + version: 1.7.2 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 clsx: specifier: ^2.1.1 version: 2.1.1 + cmdk: + specifier: ^1.0.0 + version: 1.0.0(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) geist: specifier: ^1.3.0 version: 1.3.0(next@14.2.3) @@ -46,12 +55,18 @@ dependencies: sonner: specifier: ^1.4.41 version: 1.4.41(react-dom@18.0.0)(react@18.0.0) + swr: + specifier: ^2.2.5 + version: 2.2.5(react@18.0.0) tailwind-merge: specifier: ^2.3.0 version: 2.3.0 tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.1) + zustand: + specifier: ^4.5.2 + version: 4.5.2(@types/react@18.3.2)(react@18.0.0) devDependencies: '@types/node': @@ -393,6 +408,40 @@ packages: react: 18.0.0 dev: false + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0): + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.0.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.2)(react@18.0.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.2)(react@18.0.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.2)(react@18.0.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.0.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.2)(react@18.0.0) + '@types/react': 18.3.2 + '@types/react-dom': 18.0.0 + aria-hidden: 1.2.4 + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + react-remove-scroll: 2.5.5(@types/react@18.3.2)(react@18.0.0) + dev: false + /@radix-ui/react-direction@1.0.1(@types/react@18.3.2)(react@18.0.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: @@ -1228,6 +1277,10 @@ packages: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1240,6 +1293,16 @@ packages: engines: {node: '>=4'} dev: true + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -1344,6 +1407,21 @@ packages: engines: {node: '>=6'} dev: false + /cmdk@1.0.0(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0): + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.0)(@types/react@18.3.2)(react-dom@18.0.0)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + dev: false + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1357,6 +1435,13 @@ packages: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1457,6 +1542,11 @@ packages: object-keys: 1.1.1 dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1983,6 +2073,16 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -1996,6 +2096,15 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2558,6 +2667,18 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2959,6 +3080,10 @@ packages: react-is: 16.13.1 dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3359,6 +3484,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /swr@2.2.5(react@18.0.0): + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + dependencies: + client-only: 0.0.1 + react: 18.0.0 + use-sync-external-store: 1.2.2(react@18.0.0) + dev: false + /tailwind-merge@2.3.0: resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} dependencies: @@ -3562,6 +3697,22 @@ packages: tslib: 2.6.2 dev: false + /use-sync-external-store@1.2.0(react@18.0.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.0.0 + dev: false + + /use-sync-external-store@1.2.2(react@18.0.0): + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3654,3 +3805,23 @@ packages: resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} hasBin: true + + /zustand@4.5.2(@types/react@18.3.2)(react@18.0.0): + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.3.2 + react: 18.0.0 + use-sync-external-store: 1.2.0(react@18.0.0) + dev: false diff --git a/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/assistants-list.tsx b/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/assistants-list.tsx index 86ed4d2..6f91013 100644 --- a/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/assistants-list.tsx +++ b/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/assistants-list.tsx @@ -1,9 +1,25 @@ +"use client"; import React from "react"; +import useAssistant from "./use-assistant"; +import { cn } from "@/lib/utils"; +import { Combobox } from "@/components/ui/combobox"; + + const AssistantsList = () => { - return

; + const { isFetchingAssistants, assistants } = useAssistant(); + return ( +
+ ({ value: assistant.name, label: assistant.name })) || []} + placeholder="Select assistant" + value={""} + onChange={(value) => console.log(value)} + /> +
+ ); }; export default AssistantsList; diff --git a/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/use-assistant.tsx b/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/use-assistant.tsx index e059321..3e3d87c 100644 --- a/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/use-assistant.tsx +++ b/packages/app-akeru/src/app/(dashboard)/threads/features/assistants-list/use-assistant.tsx @@ -1,5 +1,20 @@ +import { axiosInstance } from "@/lib/axios"; +import useSWR from "swr"; -export default function useSWRAssistant(){ - +const assistantFetcher = async (_: string) => { + const response = await axiosInstance.get("/assistant?query=ALL"); + return response.data; +}; +/** + * Fetches all assistant related data, and provides all apis to mutate assistant data. + */ +export default function useAssistant() { + const { + data: assistants, + error, + isLoading: isFetchingAssistants, + mutate, + } = useSWR("assistant", assistantFetcher); + return { assistants, error, mutate, isFetchingAssistants }; } diff --git a/packages/app-akeru/src/components/ui/combobox.tsx b/packages/app-akeru/src/components/ui/combobox.tsx new file mode 100644 index 0000000..e3d4dcc --- /dev/null +++ b/packages/app-akeru/src/components/ui/combobox.tsx @@ -0,0 +1,74 @@ +import * as React from "react" +import { Check, ChevronsUpDown } from "lucide-react" +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" + +interface ComboboxProps { + items: Array<{ value: string, label: string }>; + placeholder: string; + value: string; + onChange: (value: string) => void; +} + +export function Combobox({ items, placeholder, value, onChange }: ComboboxProps) { + const [open, setOpen] = React.useState(false) + + return ( + + + + + + + + + No {placeholder.toLowerCase()} found. + + {items.map((item) => ( + { + onChange(currentValue === value ? "" : currentValue) + setOpen(false) + }} + > + + {item.label} + + ))} + + + + + + ) +} \ No newline at end of file diff --git a/packages/app-akeru/src/components/ui/command.tsx b/packages/app-akeru/src/components/ui/command.tsx new file mode 100644 index 0000000..007798a --- /dev/null +++ b/packages/app-akeru/src/components/ui/command.tsx @@ -0,0 +1,155 @@ +"use client" + +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/packages/app-akeru/src/components/ui/dialog.tsx b/packages/app-akeru/src/components/ui/dialog.tsx new file mode 100644 index 0000000..01ff19c --- /dev/null +++ b/packages/app-akeru/src/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/packages/app-akeru/src/lib/axios.ts b/packages/app-akeru/src/lib/axios.ts new file mode 100644 index 0000000..3be58b4 --- /dev/null +++ b/packages/app-akeru/src/lib/axios.ts @@ -0,0 +1,14 @@ +// instantiate an axios instance +import axios from 'axios'; + +/** + * This is a temporary implementation for our swr fetchers until we have a solid auth system. + * The api token can be found within your local redis store. + */ +export const axiosInstance = axios.create({ + baseURL: process.env.NODE_ENV === "development" ? "http://localhost:8080" : "https://akeru-server.onrender.com", + timeout: 10000, + headers: { + Authorization: `Bearer ${process.env.NEXT_PUBLIC_API_TOKEN}` + } +}) \ No newline at end of file