From 9172f92af2d06a46700ba091f5a96bba31d1a4e3 Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Sat, 18 Jan 2025 04:30:07 -0500 Subject: [PATCH] init --- .gitignore | 25 + .npmrc | 1 + .prettierignore | 4 + .prettierrc | 15 + CHANGELOG.md | 15 + README.md | 69 ++ bun.lockb | Bin 0 -> 176498 bytes components.json | 14 + deno-src/deno.json | 15 + deno-src/deno.lock | 1103 +++++++++++++++++++++ deno-src/main.ts | 114 +++ eslint.config.js | 33 + package.json | 86 ++ postcss.config.js | 6 + src/app.css | 80 ++ src/app.d.ts | 13 + src/app.html | 12 + src/lib/components/ThemeCustomizer.svelte | 20 + src/lib/index.ts | 1 + src/lib/utils.ts | 56 ++ src/routes/+layout.svelte | 19 + src/routes/+layout.ts | 2 + src/routes/+page.svelte | 101 ++ src/routes/about/+page.svelte | 15 + static/favicon.png | Bin 0 -> 1571 bytes svelte.config.js | 21 + tailwind.config.ts | 67 ++ tsconfig.json | 19 + vite.config.ts | 6 + 29 files changed, 1932 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 components.json create mode 100644 deno-src/deno.json create mode 100644 deno-src/deno.lock create mode 100644 deno-src/main.ts create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/components/ThemeCustomizer.svelte create mode 100644 src/lib/index.ts create mode 100644 src/lib/utils.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/about/+page.svelte create mode 100644 static/favicon.png create mode 100644 svelte.config.js create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82a0bd8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +node_modules + +# Output +.output +.vercel +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +extensions_support/ +FaissStore/ + +.pnpm-store diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7ebb855 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4f20216 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# template-ext-sveltekit + +## 0.0.3 + +### Patch Changes + +- Updated dependencies + - @kksh/api@0.0.4 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies [fba6a49] + - @kksh/svelte@0.0.2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..8bc14a0 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# Kunkun Custom UI Extension Template (SvelteKit) + +[Custom UI Extension Documentation](https://docs.kunkun.sh/extensions/custom-ui-ext/) + +This is a template for a custom UI extension. + +This type of extension is basically a static website. You can use any frontend framework you like, this template uses [SvelteKit](https://svelte.dev/). + +It is assumed that you have some knowledge of frontend development with SvelteKit. + +## Development + +Development is the same as developing a normal website. + +```bash +pnpm install +pnpm dev +pnpm build +``` + +- To develop and preview the extension in Kunkun, you need to run the `Add Dev Extension` command in Kunkun, and register this extension's path. + +In `package.json`, `"devMain"` is the url for development server, and `"main"` is the path to static `.html` file for production. + +To load the extension in development mode, you have to enable it with `Toggle Dev Extension Live Load Mode` command in Kunkun. A `Live` badge will be shown on the commands. This indicates that dev extensions will be loaded from `devMain` instead of `main`. + +## Advanced + +### Rendering Mode + +This is a Meta-Framework template, and already configured with SSG rendering mode. +Please do not enable SSR unless you know what you are doing. +There will not be a JS runtime in production, and Kunkun always load the extension as static files. + +The main benefit of using a meta-framework is that it comes with routing, and will output multiple `.html` files, which makes multi-command support much easier. + +## Verify Build and Publish + +```bash +pnpm build # make sure the build npm script works +npx kksh@latest verify # Verify some basic settings before publishing +``` + +It is recommended to build the extension with the same environment our CI uses. + +The docker image used by our CI is `huakunshen/kunkun-ext-builder:latest`. + +You can use the following command to build the extension with the same environment our CI uses. +This requires you to have docker installed, and the shell you are using has access to it via `docker` command. + +```bash +npx kksh@latest build # Build the extension with +``` + +`pnpm` is used to install dependencies and build the extension. + +The docker image environment also has `node`, `pnpm`, `npm`, `bun`, `deno` installed. +If your build failed, try debug with `huakunshen/kunkun-ext-builder:latest` image in interative mode and bind your extension volume to `/workspace`. + +After build successfully, you should find a tarball file ends with `.tgz` in the root of your extension. +The tarball is packaged with `npm pack` command. You can uncompress it to see if it contains all the necessary files. + +This tarball is the final product that will be published and installed in Kunkun. You can further verify your extension by installing this tarball directly in Kunkun. + +After verifying the tarball, it's ready to be published. + +Fork [KunkunExtensions](https://github.com/kunkunsh/KunkunExtensions) repo, add your extension to the `extensions` directory, and create a PR. + +Once CI passed and PR merged, you can use your extension in Kunkun. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..883fa9f8e711127de516749e0788d752138dcc58 GIT binary patch literal 176498 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 literal 0 HcmV?d00001 diff --git a/components.json b/components.json new file mode 100644 index 0000000..5a53aa5 --- /dev/null +++ b/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "new-york", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app.css", + "baseColor": "neutral" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} \ No newline at end of file diff --git a/deno-src/deno.json b/deno-src/deno.json new file mode 100644 index 0000000..0bd0235 --- /dev/null +++ b/deno-src/deno.json @@ -0,0 +1,15 @@ +{ + "tasks": { + "dev": "deno run --watch -A --node-modules-dir --allow-scripts main.ts" + }, + "imports": { + "@langchain/community": "npm:@langchain/community@^0.3.22", + "@langchain/core": "npm:@langchain/core@^0.3.27", + "@langchain/langgraph": "npm:@langchain/langgraph@^0.2.38", + "@langchain/openai": "npm:@langchain/openai@^0.3.16", + "@langchain/textsplitters": "npm:@langchain/textsplitters@^0.1.0", + "@std/assert": "jsr:@std/assert@1", + "faiss-node": "npm:faiss-node@^0.5.1", + "langchain": "npm:langchain@^0.3.9" + } +} diff --git a/deno-src/deno.lock b/deno-src/deno.lock new file mode 100644 index 0000000..892701e --- /dev/null +++ b/deno-src/deno.lock @@ -0,0 +1,1103 @@ +{ + "version": "4", + "specifiers": { + "jsr:@std/assert@1": "1.0.10", + "jsr:@std/dotenv@*": "0.225.3", + "jsr:@std/internal@^1.0.5": "1.0.5", + "npm:@langchain/community@~0.3.22": "0.3.22_@browserbasehq+stagehand@1.8.0__@playwright+test@1.49.1__deepmerge@4.3.1__dotenv@16.4.7__openai@4.77.3___zod@3.24.1__zod@3.24.1_@ibm-cloud+watsonx-ai@1.3.0_@langchain+core@0.3.27__zod@3.24.1_faiss-node@0.5.1_ibm-cloud-sdk-core@5.1.0__axios@1.7.4_openai@4.77.3__zod@3.24.1_zod@3.24.1_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1", + "npm:@langchain/core@~0.3.27": "0.3.27_zod@3.24.1", + "npm:@langchain/core@~0.3.9": "0.3.27_zod@3.24.1", + "npm:@langchain/langgraph@~0.2.38": "0.2.38_@langchain+core@0.3.27__zod@3.24.1", + "npm:@langchain/openai@~0.3.16": "0.3.16_@langchain+core@0.3.27__zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "npm:@langchain/textsplitters@0.1": "0.1.0_@langchain+core@0.3.27__zod@3.24.1", + "npm:@types/node@*": "22.5.4", + "npm:faiss-node@~0.5.1": "0.5.1", + "npm:langchain@~0.3.9": "0.3.9_@langchain+core@0.3.27__zod@3.24.1_zod@3.24.1" + }, + "jsr": { + "@std/assert@1.0.10": { + "integrity": "59b5cbac5bd55459a19045d95cc7c2ff787b4f8527c0dd195078ff6f9481fbb3", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/dotenv@0.225.3": { + "integrity": "a95e5b812c27b0854c52acbae215856d9cce9d4bbf774d938c51d212711e8d4a" + }, + "@std/internal@1.0.5": { + "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" + } + }, + "npm": { + "@anthropic-ai/sdk@0.27.3": { + "integrity": "sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==", + "dependencies": [ + "@types/node@18.19.68", + "@types/node-fetch", + "abort-controller", + "agentkeepalive", + "form-data-encoder", + "formdata-node", + "node-fetch" + ] + }, + "@browserbasehq/sdk@2.0.0": { + "integrity": "sha512-BdPlZyn0dpXlL70gNK4acpqWIRB+edo2z0/GalQdWghRq8iQjySd9fVIF3evKH1p2wCYekZJRK6tm29YfXB67g==", + "dependencies": [ + "@types/node@18.19.68", + "@types/node-fetch", + "abort-controller", + "agentkeepalive", + "form-data-encoder", + "formdata-node", + "node-fetch" + ] + }, + "@browserbasehq/stagehand@1.8.0_@playwright+test@1.49.1_deepmerge@4.3.1_dotenv@16.4.7_openai@4.77.3__zod@3.24.1_zod@3.24.1": { + "integrity": "sha512-ozwE2imQzWhi1pir6+L7bwIWKXQQ+tX7oVRbQkcmHkj+xdDJJDMYxNMBJyt8mnAvXHvsadUowAWSIEfcTrNEqA==", + "dependencies": [ + "@anthropic-ai/sdk", + "@browserbasehq/sdk", + "@playwright/test", + "deepmerge", + "dotenv", + "openai", + "sharp", + "ws", + "zod", + "zod-to-json-schema" + ] + }, + "@cfworker/json-schema@4.0.3": { + "integrity": "sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==" + }, + "@emnapi/runtime@1.3.1": { + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "dependencies": [ + "tslib" + ] + }, + "@ibm-cloud/watsonx-ai@1.3.0": { + "integrity": "sha512-V4PorMPhxwYiayWxycryun4Bjxn3PJrQqJGca+maQd61Q7s+/PUJAHWjwzVSVHxiher17zFHf4NwqB8J6bWj4w==", + "dependencies": [ + "@types/node@18.19.68", + "extend", + "ibm-cloud-sdk-core" + ] + }, + "@img/sharp-darwin-arm64@0.33.5": { + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "dependencies": [ + "@img/sharp-libvips-darwin-arm64" + ] + }, + "@img/sharp-darwin-x64@0.33.5": { + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "dependencies": [ + "@img/sharp-libvips-darwin-x64" + ] + }, + "@img/sharp-libvips-darwin-arm64@1.0.4": { + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==" + }, + "@img/sharp-libvips-darwin-x64@1.0.4": { + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==" + }, + "@img/sharp-libvips-linux-arm64@1.0.4": { + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==" + }, + "@img/sharp-libvips-linux-arm@1.0.5": { + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==" + }, + "@img/sharp-libvips-linux-s390x@1.0.4": { + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==" + }, + "@img/sharp-libvips-linux-x64@1.0.4": { + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==" + }, + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": { + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==" + }, + "@img/sharp-libvips-linuxmusl-x64@1.0.4": { + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==" + }, + "@img/sharp-linux-arm64@0.33.5": { + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "dependencies": [ + "@img/sharp-libvips-linux-arm64" + ] + }, + "@img/sharp-linux-arm@0.33.5": { + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "dependencies": [ + "@img/sharp-libvips-linux-arm" + ] + }, + "@img/sharp-linux-s390x@0.33.5": { + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "dependencies": [ + "@img/sharp-libvips-linux-s390x" + ] + }, + "@img/sharp-linux-x64@0.33.5": { + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "dependencies": [ + "@img/sharp-libvips-linux-x64" + ] + }, + "@img/sharp-linuxmusl-arm64@0.33.5": { + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "dependencies": [ + "@img/sharp-libvips-linuxmusl-arm64" + ] + }, + "@img/sharp-linuxmusl-x64@0.33.5": { + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "dependencies": [ + "@img/sharp-libvips-linuxmusl-x64" + ] + }, + "@img/sharp-wasm32@0.33.5": { + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "dependencies": [ + "@emnapi/runtime" + ] + }, + "@img/sharp-win32-ia32@0.33.5": { + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==" + }, + "@img/sharp-win32-x64@0.33.5": { + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==" + }, + "@langchain/community@0.3.22_@browserbasehq+stagehand@1.8.0__@playwright+test@1.49.1__deepmerge@4.3.1__dotenv@16.4.7__openai@4.77.3___zod@3.24.1__zod@3.24.1_@ibm-cloud+watsonx-ai@1.3.0_@langchain+core@0.3.27__zod@3.24.1_faiss-node@0.5.1_ibm-cloud-sdk-core@5.1.0__axios@1.7.4_openai@4.77.3__zod@3.24.1_zod@3.24.1_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1": { + "integrity": "sha512-RGfmG3sfJhVpdFHyPwdQhrzGXdGoCoBh6zWB79/4WaMVU0q0Uo1Y/NeeslSxp778sWEeJkRcXZC73dR8lwOFjw==", + "dependencies": [ + "@browserbasehq/stagehand", + "@ibm-cloud/watsonx-ai", + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "@langchain/openai@0.3.16_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "binary-extensions", + "expr-eval", + "faiss-node", + "flat", + "ibm-cloud-sdk-core", + "js-yaml", + "langchain@0.3.9_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "openai", + "uuid@10.0.0", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/core@0.3.27_openai@4.77.3__zod@3.24.1_zod@3.24.1": { + "integrity": "sha512-jtJKbJWB1NPU1YvtrExOB2rumvUFgkJwlWGxyjSIV9A6zcLVmUbcZGV8fCSuXgl5bbzOIQLJ1xcLYQmbW9TkTg==", + "dependencies": [ + "@cfworker/json-schema", + "ansi-styles", + "camelcase", + "decamelize", + "js-tiktoken", + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "mustache", + "p-queue", + "p-retry", + "uuid@10.0.0", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/core@0.3.27_zod@3.24.1": { + "integrity": "sha512-jtJKbJWB1NPU1YvtrExOB2rumvUFgkJwlWGxyjSIV9A6zcLVmUbcZGV8fCSuXgl5bbzOIQLJ1xcLYQmbW9TkTg==", + "dependencies": [ + "@cfworker/json-schema", + "ansi-styles", + "camelcase", + "decamelize", + "js-tiktoken", + "langsmith@0.2.14", + "mustache", + "p-queue", + "p-retry", + "uuid@10.0.0", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1": { + "integrity": "sha512-jtJKbJWB1NPU1YvtrExOB2rumvUFgkJwlWGxyjSIV9A6zcLVmUbcZGV8fCSuXgl5bbzOIQLJ1xcLYQmbW9TkTg==", + "dependencies": [ + "@cfworker/json-schema", + "ansi-styles", + "camelcase", + "decamelize", + "js-tiktoken", + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "mustache", + "p-queue", + "p-retry", + "uuid@10.0.0", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/langgraph-checkpoint@0.0.13_@langchain+core@0.3.27__zod@3.24.1": { + "integrity": "sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1", + "uuid@10.0.0" + ] + }, + "@langchain/langgraph-sdk@0.0.33": { + "integrity": "sha512-l/hRbI6roLzplBXy2VyDUwqY1TkK7RcjPmrMUuVdvCCH4LTwLfIXh/G1kHatNiN7VUTskw0FkfBbgq6gtj0ang==", + "dependencies": [ + "@types/json-schema", + "p-queue", + "p-retry", + "uuid@9.0.1" + ] + }, + "@langchain/langgraph@0.2.38_@langchain+core@0.3.27__zod@3.24.1": { + "integrity": "sha512-mVy99pMftBGgUTBTCepSyzTovWCvpgdNcXsAjxTiMrMX6lzueNiBz0ljkY7UFoIoHYwurQbyl2WmMPFuxkSIAw==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1", + "@langchain/langgraph-checkpoint", + "@langchain/langgraph-sdk", + "uuid@10.0.0", + "zod" + ] + }, + "@langchain/openai@0.3.16_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1": { + "integrity": "sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "js-tiktoken", + "openai", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/openai@0.3.16_@langchain+core@0.3.27__zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1": { + "integrity": "sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "js-tiktoken", + "openai", + "zod", + "zod-to-json-schema" + ] + }, + "@langchain/textsplitters@0.1.0_@langchain+core@0.3.27__zod@3.24.1": { + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1", + "js-tiktoken" + ] + }, + "@langchain/textsplitters@0.1.0_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_openai@4.77.3__zod@3.24.1": { + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "js-tiktoken" + ] + }, + "@playwright/test@1.49.1": { + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", + "dependencies": [ + "playwright" + ] + }, + "@tokenizer/token@0.3.0": { + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/debug@4.1.12": { + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": [ + "@types/ms" + ] + }, + "@types/json-schema@7.0.15": { + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "@types/ms@0.7.34": { + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "@types/node-fetch@2.6.12": { + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dependencies": [ + "@types/node@22.5.4", + "form-data@4.0.1" + ] + }, + "@types/node@10.14.22": { + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==" + }, + "@types/node@18.19.68": { + "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", + "dependencies": [ + "undici-types@5.26.5" + ] + }, + "@types/node@22.5.4": { + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dependencies": [ + "undici-types@6.19.8" + ] + }, + "@types/retry@0.12.0": { + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/tough-cookie@4.0.5": { + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, + "@types/uuid@10.0.0": { + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + }, + "abort-controller@3.0.0": { + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": [ + "event-target-shim" + ] + }, + "agentkeepalive@4.6.0": { + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dependencies": [ + "humanize-ms" + ] + }, + "ansi-styles@5.2.0": { + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "asynckit@0.4.0": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios@1.7.4": { + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dependencies": [ + "follow-redirects", + "form-data@4.0.1", + "proxy-from-env" + ] + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary-extensions@2.3.0": { + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "bindings@1.5.0": { + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": [ + "file-uri-to-path" + ] + }, + "bl@4.1.0": { + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": [ + "buffer", + "inherits", + "readable-stream" + ] + }, + "buffer-equal-constant-time@1.0.1": { + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer@5.7.1": { + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": [ + "base64-js", + "ieee754" + ] + }, + "camelcase@6.3.0": { + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "chownr@1.1.4": { + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string@1.9.1": { + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": [ + "color-name", + "simple-swizzle" + ] + }, + "color@4.2.3": { + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": [ + "color-convert", + "color-string" + ] + }, + "combined-stream@1.0.8": { + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": [ + "delayed-stream" + ] + }, + "commander@10.0.1": { + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + }, + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": [ + "ms" + ] + }, + "decamelize@1.2.0": { + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decompress-response@6.0.0": { + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": [ + "mimic-response" + ] + }, + "deep-extend@0.6.0": { + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deepmerge@4.3.1": { + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "delayed-stream@1.0.0": { + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-libc@2.0.3": { + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" + }, + "dotenv@16.4.7": { + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" + }, + "ecdsa-sig-formatter@1.0.11": { + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": [ + "safe-buffer" + ] + }, + "end-of-stream@1.4.4": { + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": [ + "once" + ] + }, + "event-target-shim@5.0.1": { + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter3@4.0.7": { + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "expand-template@2.0.3": { + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "expr-eval@2.0.2": { + "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" + }, + "extend@3.0.2": { + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "faiss-node@0.5.1": { + "integrity": "sha512-zD8wobJn8C6OLWo68Unho+Ih8l6nSRB2w3Amj01a+xc4bsEvd2mBDLklAn7VocA9XO3WDvQL/bLpi5flkCn/XQ==", + "dependencies": [ + "bindings", + "node-addon-api", + "prebuild-install" + ] + }, + "file-type@16.5.4": { + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": [ + "readable-web-to-node-stream", + "strtok3", + "token-types" + ] + }, + "file-uri-to-path@1.0.0": { + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "flat@5.0.2": { + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "follow-redirects@1.15.9": { + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" + }, + "form-data-encoder@1.7.2": { + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "form-data@4.0.0": { + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": [ + "asynckit", + "combined-stream", + "mime-types" + ] + }, + "form-data@4.0.1": { + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": [ + "asynckit", + "combined-stream", + "mime-types" + ] + }, + "formdata-node@4.4.1": { + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": [ + "node-domexception", + "web-streams-polyfill" + ] + }, + "fs-constants@1.0.0": { + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fsevents@2.3.2": { + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" + }, + "github-from-package@0.0.0": { + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "humanize-ms@1.2.1": { + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": [ + "ms" + ] + }, + "ibm-cloud-sdk-core@5.1.0_axios@1.7.4": { + "integrity": "sha512-KJCbPz3tiXB1NGAD7cL4JtwpWV8yd/C7jsaHsxvedMo2ZblNG8emMyvSpGhiKAQVZmi3c0ujz6eJdy22NHuUWQ==", + "dependencies": [ + "@types/debug", + "@types/node@10.14.22", + "@types/tough-cookie", + "axios", + "camelcase", + "debug", + "dotenv", + "extend", + "file-type", + "form-data@4.0.0", + "isstream", + "jsonwebtoken", + "mime-types", + "retry-axios", + "tough-cookie" + ] + }, + "ieee754@1.2.1": { + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini@1.3.8": { + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "is-arrayish@0.3.2": { + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "isstream@0.1.2": { + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "js-tiktoken@1.0.16": { + "integrity": "sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==", + "dependencies": [ + "base64-js" + ] + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": [ + "argparse" + ] + }, + "jsonpointer@5.0.1": { + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsonwebtoken@9.0.2": { + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": [ + "jws", + "lodash.includes", + "lodash.isboolean", + "lodash.isinteger", + "lodash.isnumber", + "lodash.isplainobject", + "lodash.isstring", + "lodash.once", + "ms", + "semver" + ] + }, + "jwa@1.4.1": { + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": [ + "buffer-equal-constant-time", + "ecdsa-sig-formatter", + "safe-buffer" + ] + }, + "jws@3.2.2": { + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": [ + "jwa", + "safe-buffer" + ] + }, + "langchain@0.3.9_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_openai@4.77.3__zod@3.24.1_zod@3.24.1": { + "integrity": "sha512-uteRutI03Bt9f53nZmx8mWfJXkf6VlFVRuOprRJ0mWdCpkTP359sxrH4v6w4TokLiziPC/aMay662kmOz0dHlA==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "@langchain/openai@0.3.16_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "@langchain/textsplitters@0.1.0_@langchain+core@0.3.27__zod@3.24.1__openai@4.77.3___zod@3.24.1_openai@4.77.3__zod@3.24.1", + "js-tiktoken", + "js-yaml", + "jsonpointer", + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "openapi-types", + "p-retry", + "uuid@10.0.0", + "yaml", + "zod", + "zod-to-json-schema" + ] + }, + "langchain@0.3.9_@langchain+core@0.3.27__zod@3.24.1_zod@3.24.1": { + "integrity": "sha512-uteRutI03Bt9f53nZmx8mWfJXkf6VlFVRuOprRJ0mWdCpkTP359sxrH4v6w4TokLiziPC/aMay662kmOz0dHlA==", + "dependencies": [ + "@langchain/core@0.3.27_zod@3.24.1", + "@langchain/openai@0.3.16_@langchain+core@0.3.27__zod@3.24.1_zod@3.24.1_openai@4.77.3__zod@3.24.1", + "@langchain/textsplitters@0.1.0_@langchain+core@0.3.27__zod@3.24.1", + "js-tiktoken", + "js-yaml", + "jsonpointer", + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1", + "openapi-types", + "p-retry", + "uuid@10.0.0", + "yaml", + "zod", + "zod-to-json-schema" + ] + }, + "langsmith@0.2.14": { + "integrity": "sha512-ClAuAgSf3m9miMYotLEaZKQyKdaWlfjhebCuYco8bc6g72dU2VwTg31Bv4YINBq7EH2i1cMwbOiJxbOXPqjGig==", + "dependencies": [ + "@types/uuid", + "commander", + "p-queue", + "p-retry", + "semver", + "uuid@10.0.0" + ] + }, + "langsmith@0.2.14_openai@4.77.3__zod@3.24.1_zod@3.24.1": { + "integrity": "sha512-ClAuAgSf3m9miMYotLEaZKQyKdaWlfjhebCuYco8bc6g72dU2VwTg31Bv4YINBq7EH2i1cMwbOiJxbOXPqjGig==", + "dependencies": [ + "@types/uuid", + "commander", + "openai", + "p-queue", + "p-retry", + "semver", + "uuid@10.0.0" + ] + }, + "lodash.includes@4.3.0": { + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean@3.0.3": { + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger@4.0.4": { + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber@3.0.3": { + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject@4.0.6": { + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring@4.0.1": { + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.once@4.1.1": { + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, + "mimic-response@3.1.0": { + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp-classic@0.5.3": { + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "mustache@4.2.0": { + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + }, + "napi-build-utils@1.0.2": { + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node-abi@3.71.0": { + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dependencies": [ + "semver" + ] + }, + "node-addon-api@6.1.0": { + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node-domexception@1.0.0": { + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch@2.7.0": { + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": [ + "whatwg-url" + ] + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "openai@4.77.3_zod@3.24.1": { + "integrity": "sha512-wLDy4+KWHz31HRFMW2+9KQuVuT2QWhs0z94w1Gm1h2Ut9vIHr9/rHZggbykZEfyiaJRVgw8ZS9K6AylDWzvPYw==", + "dependencies": [ + "@types/node@18.19.68", + "@types/node-fetch", + "abort-controller", + "agentkeepalive", + "form-data-encoder", + "formdata-node", + "node-fetch", + "zod" + ] + }, + "openapi-types@12.1.3": { + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" + }, + "p-finally@1.0.0": { + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, + "p-queue@6.6.2": { + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": [ + "eventemitter3", + "p-timeout" + ] + }, + "p-retry@4.6.2": { + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": [ + "@types/retry", + "retry" + ] + }, + "p-timeout@3.2.0": { + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": [ + "p-finally" + ] + }, + "peek-readable@4.1.0": { + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" + }, + "playwright-core@1.49.1": { + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==" + }, + "playwright@1.49.1": { + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "dependencies": [ + "fsevents", + "playwright-core" + ] + }, + "prebuild-install@7.1.2": { + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": [ + "detect-libc", + "expand-template", + "github-from-package", + "minimist", + "mkdirp-classic", + "napi-build-utils", + "node-abi", + "pump", + "rc", + "simple-get", + "tar-fs", + "tunnel-agent" + ] + }, + "proxy-from-env@1.1.0": { + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "psl@1.15.0": { + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": [ + "punycode" + ] + }, + "pump@3.0.2": { + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": [ + "end-of-stream", + "once" + ] + }, + "punycode@2.3.1": { + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "querystringify@2.2.0": { + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "rc@1.2.8": { + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": [ + "deep-extend", + "ini", + "minimist", + "strip-json-comments" + ] + }, + "readable-stream@3.6.2": { + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": [ + "inherits", + "string_decoder", + "util-deprecate" + ] + }, + "readable-web-to-node-stream@3.0.2": { + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": [ + "readable-stream" + ] + }, + "requires-port@1.0.0": { + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "retry-axios@2.6.0_axios@1.7.4": { + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", + "dependencies": [ + "axios" + ] + }, + "retry@0.13.1": { + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver@7.6.3": { + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + }, + "sharp@0.33.5": { + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dependencies": [ + "@img/sharp-darwin-arm64", + "@img/sharp-darwin-x64", + "@img/sharp-libvips-darwin-arm64", + "@img/sharp-libvips-darwin-x64", + "@img/sharp-libvips-linux-arm", + "@img/sharp-libvips-linux-arm64", + "@img/sharp-libvips-linux-s390x", + "@img/sharp-libvips-linux-x64", + "@img/sharp-libvips-linuxmusl-arm64", + "@img/sharp-libvips-linuxmusl-x64", + "@img/sharp-linux-arm", + "@img/sharp-linux-arm64", + "@img/sharp-linux-s390x", + "@img/sharp-linux-x64", + "@img/sharp-linuxmusl-arm64", + "@img/sharp-linuxmusl-x64", + "@img/sharp-wasm32", + "@img/sharp-win32-ia32", + "@img/sharp-win32-x64", + "color", + "detect-libc", + "semver" + ] + }, + "simple-concat@1.0.1": { + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get@4.0.1": { + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dependencies": [ + "decompress-response", + "once", + "simple-concat" + ] + }, + "simple-swizzle@0.2.2": { + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": [ + "is-arrayish" + ] + }, + "string_decoder@1.3.0": { + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": [ + "safe-buffer" + ] + }, + "strip-json-comments@2.0.1": { + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "strtok3@6.3.0": { + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": [ + "@tokenizer/token", + "peek-readable" + ] + }, + "tar-fs@2.1.1": { + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": [ + "chownr", + "mkdirp-classic", + "pump", + "tar-stream" + ] + }, + "tar-stream@2.2.0": { + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": [ + "bl", + "end-of-stream", + "fs-constants", + "inherits", + "readable-stream" + ] + }, + "token-types@4.2.1": { + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": [ + "@tokenizer/token", + "ieee754" + ] + }, + "tough-cookie@4.1.4": { + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": [ + "psl", + "punycode", + "universalify", + "url-parse" + ] + }, + "tr46@0.0.3": { + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tunnel-agent@0.6.0": { + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": [ + "safe-buffer" + ] + }, + "undici-types@5.26.5": { + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "undici-types@6.19.8": { + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "universalify@0.2.0": { + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + }, + "url-parse@1.5.10": { + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": [ + "querystringify", + "requires-port" + ] + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid@10.0.0": { + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" + }, + "uuid@9.0.1": { + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "web-streams-polyfill@4.0.0-beta.3": { + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==" + }, + "webidl-conversions@3.0.1": { + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url@5.0.0": { + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": [ + "tr46", + "webidl-conversions" + ] + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws@8.18.0": { + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + }, + "yaml@2.6.1": { + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==" + }, + "zod-to-json-schema@3.24.1_zod@3.24.1": { + "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", + "dependencies": [ + "zod" + ] + }, + "zod@3.24.1": { + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" + } + }, + "redirects": { + "https://deno.land/std/dotenv/mod.ts": "https://deno.land/std@0.224.0/dotenv/mod.ts" + }, + "remote": { + "https://deno.land/std@0.224.0/dotenv/mod.ts": "0180eaeedaaf88647318811cdaa418cc64dc51fb08354f91f5f480d0a1309f7d", + "https://deno.land/std@0.224.0/dotenv/parse.ts": "09977ff88dfd1f24f9973a338f0f91bbdb9307eb5ff6085446e7c423e4c7ba0c", + "https://deno.land/std@0.224.0/dotenv/stringify.ts": "275da322c409170160440836342eaa7cf012a1d11a7e700d8ca4e7f2f8aa4615" + }, + "workspace": { + "dependencies": [ + "jsr:@std/assert@1", + "npm:@langchain/community@~0.3.22", + "npm:@langchain/core@~0.3.27", + "npm:@langchain/langgraph@~0.2.38", + "npm:@langchain/openai@~0.3.16", + "npm:@langchain/textsplitters@0.1", + "npm:faiss-node@~0.5.1", + "npm:langchain@~0.3.9" + ] + } +} diff --git a/deno-src/main.ts b/deno-src/main.ts new file mode 100644 index 0000000..c95d6f4 --- /dev/null +++ b/deno-src/main.ts @@ -0,0 +1,114 @@ +import { FaissStore } from "@langchain/community/vectorstores/faiss"; +import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai"; +import { Document } from "@langchain/core/documents"; +import { ChatPromptTemplate } from "@langchain/core/prompts"; +import { pull } from "langchain/hub"; +import { Annotation, StateGraph } from "@langchain/langgraph"; +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; +import { DirectoryLoader } from "langchain/document_loaders/fs/directory"; +import fs from "node:fs"; +import "jsr:@std/dotenv/load"; +import { + JSONLoader, + JSONLinesLoader, +} from "langchain/document_loaders/fs/json"; +import { TextLoader } from "langchain/document_loaders/fs/text"; + +const embeddings = new OpenAIEmbeddings({ + model: "text-embedding-3-large", +}); +async function getVectorStore(): Promise { + // if ./FaissStore dir exists, load it + if (fs.existsSync("./FaissStore")) { + return FaissStore.load("./FaissStore", embeddings); + } + + const loader = new DirectoryLoader("/Users/hk/Desktop/rag-ts/datasets", { + ".json": (path) => new JSONLoader(path, "/texts"), + ".jsonl": (path) => new JSONLinesLoader(path, "/html"), + ".txt": (path) => new TextLoader(path), + ".md": (path) => new TextLoader(path), + }); + const docs = await loader.load(); + console.log(docs); + + const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, + chunkOverlap: 200, + }); + const allSplits = await splitter.splitDocuments(docs); + + const vectorStore = new FaissStore(embeddings, {}); + await vectorStore.addDocuments(allSplits); + + // Save the vector store to disk + await vectorStore.save("./FaissStore"); + return vectorStore; +} + +// Add this new function to delete documents +async function deleteDocuments(vectorStore: FaissStore, ids: string[]) { + await vectorStore.delete({ ids }); + // Save the updated store + await vectorStore.save("./FaissStore"); +} + +const vectorStore = await getVectorStore(); + +const llm = new ChatOpenAI({ + model: "gpt-4o-mini", + temperature: 0, +}); + +// Define prompt for question-answering +const promptTemplate = await pull("rlm/rag-prompt"); + +// Define state for application +const InputStateAnnotation = Annotation.Root({ + question: Annotation, +}); + +const StateAnnotation = Annotation.Root({ + question: Annotation, + context: Annotation, + answer: Annotation, +}); + +// Define application steps +const retrieve = async (state: typeof InputStateAnnotation.State) => { + const retrievedDocs = await vectorStore.similaritySearch(state.question); + return { context: retrievedDocs }; +}; + +const generate = async (state: typeof StateAnnotation.State) => { + const docsContent = state.context.map((doc) => doc.pageContent).join("\n"); + const messages = await promptTemplate.invoke({ + question: state.question, + context: docsContent, + }); + const response = await llm.invoke(messages); + return { answer: response.content }; +}; + +// Compile application and test +const graph = new StateGraph(StateAnnotation) + .addNode("retrieve", retrieve) + .addNode("generate", generate) + .addEdge("__start__", "retrieve") + .addEdge("retrieve", "generate") + .addEdge("generate", "__end__") + .compile(); + +let inputs = { question: "What is Task Decomposition?" }; + +while (true) { + const question = prompt("Enter your question (or 'exit' to quit): "); + if (!question || question.toLowerCase() === "exit") { + break; + } + + const result = await graph.invoke({ question }); + console.log("\nAnswer:"); + console.log(result.answer); + console.log("\n-------------------\n"); +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..62dbd03 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js'; +import ts from 'typescript-eslint'; +import svelte from 'eslint-plugin-svelte'; +import prettier from 'eslint-config-prettier'; +import globals from 'globals'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + ...svelte.configs['flat/prettier'], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + files: ['**/*.svelte'], + languageOptions: { + parserOptions: { + parser: ts.parser + } + } + }, + { + ignores: ['build/', '.svelte-kit/', 'dist/'] + } +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..ba38cf2 --- /dev/null +++ b/package.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://schema.kunkun.sh", + "name": "RAG", + "draft": true, + "version": "0.0.3", + "private": true, + "kunkun": { + "name": "TODO: Change Display Name", + "shortDescription": "A Custom UI template for sveltekit", + "longDescription": "A Custom UI template for sveltekit", + "identifier": "RAG", + "icon": { + "type": "iconify", + "value": "logos:svelte-icon" + }, + "demoImages": [], + "permissions": [ + "clipboard:read-text", + "notification:all" + ], + "customUiCmds": [ + { + "main": "/", + "dist": "build", + "devMain": "http://localhost:5173", + "name": "Sveltekit Template Home Page", + "cmds": [] + }, + { + "main": "about", + "dist": "build", + "devMain": "http://localhost:5173/about", + "name": "Sveltekit Template About Page", + "cmds": [] + } + ], + "templateUiCmds": [] + }, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write ." + }, + "dependencies": { + "@kksh/api": "^0.0.48", + "@kksh/svelte5": "0.1.10", + "clsx": "^2.1.1", + "lucide-svelte": "^0.460.1", + "mode-watcher": "^0.5.0", + "tailwind-merge": "^2.5.4", + "tailwind-variants": "^0.3.0" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^3.3.1", + "@sveltejs/kit": "^2.8.1", + "@sveltejs/vite-plugin-svelte": "^4.0.1", + "svelte": "^5.2.7", + "svelte-check": "^4.0.9", + "typescript": "^5.6.3", + "vite": "^5.4.11", + "@sveltejs/adapter-static": "^3.0.6", + "@tailwindcss/typography": "^0.5.15", + "@types/eslint": "^9.6.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.46.0", + "globals": "^15.12.0", + "postcss": "^8.4.49", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.8", + "prettier-plugin-tailwindcss": "^0.6.9", + "tailwindcss": "^3.4.15", + "typescript-eslint": "^8.15.0" + }, + "type": "module", + "files": [ + "build", + ".gitignore" + ], + "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a" +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..0f77216 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..117997f --- /dev/null +++ b/src/app.css @@ -0,0 +1,80 @@ +@import url("@kksh/svelte5/themes"); +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 0 0% 98%; + + --ring: 0 0% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --ring: 0 0% 83.1%; + } +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..743f07b --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..77a5ff5 --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/components/ThemeCustomizer.svelte b/src/lib/components/ThemeCustomizer.svelte new file mode 100644 index 0000000..d7b86b2 --- /dev/null +++ b/src/lib/components/ThemeCustomizer.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..eba19d8 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,56 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import { cubicOut } from 'svelte/easing'; +import type { TransitionConfig } from 'svelte/transition'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === 'none' ? '' : style.transform; + + const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = (style: Record): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ''); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t + }); + }, + easing: cubicOut + }; +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..c180a86 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,19 @@ + + + + + + diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..ceccaaf --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = true; +export const ssr = false; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..7f8d723 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,101 @@ + + + + + + + +
+ + No results found. + + + + + Calendar + + + + Search Emoji + + + + Calculator + + + + + + + Profile + ⌘P + + + + Billing + ⌘B + + + + Settings + ⌘S + + + +
+
+ + diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte new file mode 100644 index 0000000..f514f24 --- /dev/null +++ b/src/routes/about/+page.svelte @@ -0,0 +1,15 @@ + + + + + About Page + + + + + + + diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH)', + input: 'hsl(var(--input) / )', + ring: 'hsl(var(--ring) / )', + background: 'hsl(var(--background) / )', + foreground: 'hsl(var(--foreground) / )', + primary: { + DEFAULT: 'hsl(var(--primary) / )', + foreground: 'hsl(var(--primary-foreground) / )' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary) / )', + foreground: 'hsl(var(--secondary-foreground) / )' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive) / )', + foreground: 'hsl(var(--destructive-foreground) / )' + }, + muted: { + DEFAULT: 'hsl(var(--muted) / )', + foreground: 'hsl(var(--muted-foreground) / )' + }, + accent: { + DEFAULT: 'hsl(var(--accent) / )', + foreground: 'hsl(var(--accent-foreground) / )' + }, + popover: { + DEFAULT: 'hsl(var(--popover) / )', + foreground: 'hsl(var(--popover-foreground) / )' + }, + card: { + DEFAULT: 'hsl(var(--card) / )', + foreground: 'hsl(var(--card-foreground) / )' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + fontFamily: { + sans: [...fontFamily.sans] + } + } + } +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..fc93cbd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +});
+ +
+ + + + + + +
+