diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml new file mode 100644 index 0000000000..095ba6aee8 --- /dev/null +++ b/.github/workflows/build-release.yml @@ -0,0 +1,40 @@ +name: Build and Attach to Release + +on: + release: + types: [published] + workflow_dispatch: + +jobs: + build-and-attach: + runs-on: ubuntu-latest + permissions: + contents: write # Required for uploading release assets + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js and pnpm + uses: ./.github/actions/setup-node-pnpm + with: + skip-checkout: 'true' + + - name: Create .env file + run: echo "POSTHOG_API_KEY=${{ secrets.POSTHOG_API_KEY }}" >> .env + + - name: Build and Package Extension + run: | + pnpm bundle + pnpm vsix + + - name: Get package version + id: version + run: echo "version=$(node -p "require('./src/package.json').version")" >> $GITHUB_OUTPUT + + - name: Upload VSIX to Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload ${{ github.event.release.tag_name }} \ + bin/tne-code-${{ steps.version.outputs.version }}.vsix \ + --clobber \ No newline at end of file diff --git a/.github/workflows/discord-pr-notify.yml b/.github/workflows/discord-pr-notify.yml index 88c918edfe..e0e3f52e50 100644 --- a/.github/workflows/discord-pr-notify.yml +++ b/.github/workflows/discord-pr-notify.yml @@ -1,9 +1,7 @@ name: Discord PR Notifier on: - workflow_dispatch: - pull_request_target: - types: [opened] + # Disabled - no triggers jobs: notify: diff --git a/.gitignore b/.gitignore index 967e956b55..0c032bbf76 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,3 @@ logs .idea/ .qodo/ .vercel -.roo/mcp.json diff --git a/.husky/pre-push b/.husky/pre-push.backup similarity index 100% rename from .husky/pre-push rename to .husky/pre-push.backup diff --git a/.roomodes b/.roomodes index d222dd65e7..cb2fa237ab 100644 --- a/.roomodes +++ b/.roomodes @@ -2,7 +2,7 @@ customModes: - slug: test name: 🧪 Test roleDefinition: >- - You are Roo, a Jest testing specialist with deep expertise in: + You are TNE-Code, a Jest testing specialist with deep expertise in: - Writing and maintaining Jest test suites @@ -61,7 +61,7 @@ customModes: - slug: design-engineer name: 🎨 Design Engineer roleDefinition: >- - You are Roo, an expert Design Engineer focused on VSCode Extension + You are TNE-Code, an expert Design Engineer focused on VSCode Extension development. Your expertise includes: - Implementing UI designs with high fidelity using React, Shadcn, Tailwind @@ -102,7 +102,7 @@ customModes: source: project - slug: release-engineer name: 🚀 Release Engineer - roleDefinition: You are Roo, a release engineer specialized in automating the + roleDefinition: You are TNE-Code, a release engineer specialized in automating the release process for software projects. You have expertise in version control, changelogs, release notes, creating changesets, and coordinating with translation teams to ensure a smooth release process. @@ -172,8 +172,8 @@ customModes: - browser source: project - slug: translate - name: 🌐 Translate - roleDefinition: You are Roo, a linguistic specialist focused on translating and + name: ✍️ Translate + roleDefinition: You are TNE-Code, a linguistic specialist focused on translating and managing localization files. Your responsibility is to help maintain and update translation files for the application, ensuring consistency and accuracy across all language resources. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..32a181a33b --- /dev/null +++ b/Makefile @@ -0,0 +1,96 @@ +# TNE Code VSCode Extension - Development Makefile +# +# This Makefile provides streamlined development commands for the TNE Code extension. +# Environment variables can be set via .env files or using direnv with .envrc +# For enhanced security, consider using 1Password CLI for API key management. + +.PHONY: help install dev run clean test lint format build vsix + +## help: Show this help message +help: + @echo "TNE Code Development Commands:" + @echo "" + @sed -n 's/^##//p' $(MAKEFILE_LIST) | column -t -s ':' | sed -e 's/^/ /' + +## install: Install all dependencies and setup development environment +install: + @echo "Installing dependencies with pnpm..." + pnpm install + @echo "" + @echo "✅ Installation complete!" + @echo "" + @echo "Environment Variables (optional):" + @echo "- Create .env files in workspaces or use direnv with .envrc" + @echo "- Consider using 1Password CLI: op run --env-file=.env -- make dev" + @echo "" + @echo "Development Setup:" + @echo "- Vector Database: Qdrant (see docs for setup if using code indexing)" + @echo "- AI Providers: Configure API keys in VSCode settings" + @echo "- MCP Servers: Optional external integrations" + +## dev: Start development with file watching +dev: + @echo "Starting development mode with file watching..." + pnpm run watch:bundle & pnpm run watch:tsc + +## run: Launch VSCode extension host for testing +run: + @echo "Launching VSCode Extension Development Host..." + @echo "Press F5 in VSCode or use 'Debug: Start Debugging' command" + @echo "Alternatively, build and install the extension:" + $(MAKE) vsix + +## test: Run all tests across workspaces +test: + @echo "Running tests with Turborepo..." + pnpm test + +## lint: Run linting across all workspaces +lint: + @echo "Running ESLint across workspaces..." + pnpm lint + +## format: Format code with Prettier +format: + @echo "Formatting code with Prettier..." + pnpm format + +## build: Build all packages and extension +build: + @echo "Building all packages..." + pnpm build + +## bundle: Bundle extension for distribution +bundle: + @echo "Bundling extension..." + pnpm bundle + +## vsix: Create VSCode extension package (.vsix file) +vsix: bundle + @echo "Creating VSIX package..." + pnpm vsix + @echo "Extension package created in bin/ directory" + @echo "Install with: code --install-extension bin/tne-code-*.vsix" + +## clean: Clean all build artifacts and node_modules +clean: + @echo "Cleaning build artifacts..." + pnpm clean + @echo "Removing node_modules..." + find . -name "node_modules" -type d -exec rm -rf {} + 2>/dev/null || true + @echo "Clean complete!" + +## check-types: Type check all TypeScript files +check-types: + @echo "Type checking with TypeScript..." + pnpm check-types + +## update-deps: Update all dependencies +update-deps: + @echo "Updating dependencies..." + pnpm update --recursive + +## evals: Start evaluation environment (Docker required) +evals: + @echo "Starting evaluation environment..." + pnpm evals \ No newline at end of file diff --git a/README.md b/README.md index 9f07ac6dce..13321171e3 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ English • [Català](locales/ca/README.md) • [Deutsch](locales/de/README.md)
-

Roo Code (prev. Roo Cline)

+

TNE Code

@@ -34,7 +34,7 @@ English • [Català](locales/ca/README.md) • [Deutsch](locales/de/README.md)
-**Roo Code** is an AI-powered **autonomous coding agent** that lives in your editor. It can: +**TNE Code** is an AI-powered **autonomous coding agent** that lives in your editor. It can: - Communicate in natural language - Read and write files directly in your workspace @@ -43,15 +43,15 @@ English • [Català](locales/ca/README.md) • [Deutsch](locales/de/README.md) - Integrate with any OpenAI-compatible or custom API/model - Adapt its “personality” and capabilities through **Custom Modes** -Whether you’re seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, Roo Code can help you build software more efficiently. +Whether you're seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, TNE Code can help you build software more efficiently. Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. --- -## 🎉 Roo Code 3.19 Released +## 🎉 TNE Code 3.19 Released -Roo Code 3.19 brings intelligent context management improvements and enhanced user experience! +TNE Code 3.19 brings intelligent context management improvements and enhanced user experience! - **Intelligent Context Condensing Enabled by Default** - Context condensing is now enabled by default with configurable settings for when automatic condensing happens. - **Manual Condensing Button** - New button in the task header allows you to manually trigger context condensing at any time. @@ -59,7 +59,7 @@ Roo Code 3.19 brings intelligent context management improvements and enhanced us --- -## What Can Roo Code Do? +## What Can TNE Code Do? - 🚀 **Generate Code** from natural language descriptions - 🔧 **Refactor & Debug** existing code @@ -70,7 +70,7 @@ Roo Code 3.19 brings intelligent context management improvements and enhanced us ## Quick Start -1. [Install Roo Code](https://docs.roocode.com/getting-started/installing) +1. [Install TNE Code](https://docs.roocode.com/getting-started/installing) 2. [Connect Your AI Provider](https://docs.roocode.com/getting-started/connecting-api-provider) 3. [Try Your First Task](https://docs.roocode.com/getting-started/your-first-task) @@ -78,7 +78,7 @@ Roo Code 3.19 brings intelligent context management improvements and enhanced us ### Multiple Modes -Roo Code adapts to your needs with specialized [modes](https://docs.roocode.com/basic-usage/using-modes): +TNE Code adapts to your needs with specialized [modes](https://docs.roocode.com/basic-usage/using-modes): - **Code Mode:** For general-purpose coding tasks - **Architect Mode:** For planning and technical leadership @@ -88,18 +88,18 @@ Roo Code adapts to your needs with specialized [modes](https://docs.roocode.com/ ### Smart Tools -Roo Code comes with powerful [tools](https://docs.roocode.com/basic-usage/how-tools-work) that can: +TNE Code comes with powerful [tools](https://docs.roocode.com/basic-usage/how-tools-work) that can: - Read and write files in your project - Execute commands in your VS Code terminal - Control a web browser - Use external tools via [MCP (Model Context Protocol)](https://docs.roocode.com/advanced-usage/mcp) -MCP extends Roo Code's capabilities by allowing you to add unlimited custom tools. Integrate with external APIs, connect to databases, or create specialized development tools - MCP provides the framework to expand Roo Code's functionality to meet your specific needs. +MCP extends TNE Code's capabilities by allowing you to add unlimited custom tools. Integrate with external APIs, connect to databases, or create specialized development tools - MCP provides the framework to expand TNE Code's functionality to meet your specific needs. ### Customization -Make Roo Code work your way with: +Make TNE Code work your way with: - [Custom Instructions](https://docs.roocode.com/advanced-usage/custom-instructions) for personalized behavior - [Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes) for specialized tasks @@ -124,43 +124,83 @@ Make Roo Code work your way with: ## Local Setup & Development +### Quick Start with Makefile + 1. **Clone** the repo: ```sh git clone https://github.com/RooCodeInc/Roo-Code.git +cd Roo-Code ``` 2. **Install dependencies**: ```sh -pnpm install +make install ``` -3. **Run the extension**: +3. **Start development**: -Press `F5` (or **Run** → **Start Debugging**) in VSCode to open a new window with Roo Code running. +```sh +make dev # Start file watching for development +make run # Launch VSCode extension host for testing +``` -Changes to the webview will appear immediately. Changes to the core extension will require a restart of the extension host. +### Available Make Commands -Alternatively you can build a .vsix and install it directly in VSCode: +Run `make help` to see all available commands: ```sh -pnpm vsix +make help # Show all available commands +make install # Install dependencies and setup environment +make dev # Start development with file watching +make run # Launch VSCode extension host for testing +make test # Run all tests across workspaces +make lint # Run linting across all workspaces +make format # Format code with Prettier +make build # Build all packages and extension +make vsix # Create VSCode extension package (.vsix file) +make clean # Clean all build artifacts ``` -A `.vsix` file will appear in the `bin/` directory which can be installed with: +### Alternative Development Methods + +**VSCode Debug Method**: Press `F5` (or **Run** → **Start Debugging**) in VSCode to open a new window with TNE Code running. + +**Manual Build**: Changes to the webview will appear immediately. Changes to the core extension will require a restart of the extension host. + +**Install from VSIX**: Build and install the extension directly: ```sh -code --install-extension bin/roo-cline-.vsix +make vsix +code --install-extension bin/tne-code-*.vsix ``` +### Environment Setup + +- **Environment Variables**: Create `.env` files in workspaces or use `direnv` with `.envrc` +- **Security**: Consider using 1Password CLI: `op run --env-file=.env -- make dev` +- **Vector Database**: Qdrant setup required if using code indexing features +- **AI Providers**: Configure API keys in VSCode settings +- **MCP Servers**: Optional external integrations + +### Development Architecture + +This is a **monorepo** using pnpm workspaces and Turborepo: + +- **`src/`** - Main VSCode extension (TypeScript) +- **`webview-ui/`** - React-based user interface +- **`packages/`** - Shared TypeScript types and utilities +- **`apps/`** - Additional applications +- **`docs/`** - Project documentation + We use [changesets](https://github.com/changesets/changesets) for versioning and publishing. Check our `CHANGELOG.md` for release notes. --- ## Disclaimer -**Please note** that Roo Code, Inc does **not** make any representations or warranties regarding any code, models, or other tools provided or made available in connection with Roo Code, any associated third-party tools, or any resulting outputs. You assume **all risks** associated with the use of any such tools or outputs; such tools are provided on an **"AS IS"** and **"AS AVAILABLE"** basis. Such risks may include, without limitation, intellectual property infringement, cyber vulnerabilities or attacks, bias, inaccuracies, errors, defects, viruses, downtime, property loss or damage, and/or personal injury. You are solely responsible for your use of any such tools or outputs (including, without limitation, the legality, appropriateness, and results thereof). +**Please note** that TNE Code does **not** make any representations or warranties regarding any code, models, or other tools provided or made available in connection with TNE Code, any associated third-party tools, or any resulting outputs. You assume **all risks** associated with the use of any such tools or outputs; such tools are provided on an **"AS IS"** and **"AS AVAILABLE"** basis. Such risks may include, without limitation, intellectual property infringement, cyber vulnerabilities or attacks, bias, inaccuracies, errors, defects, viruses, downtime, property loss or damage, and/or personal injury. You are solely responsible for your use of any such tools or outputs (including, without limitation, the legality, appropriateness, and results thereof). --- @@ -172,7 +212,7 @@ We love community contributions! Get started by reading our [CONTRIBUTING.md](CO ## Contributors -Thanks to all our contributors who have helped make Roo Code better! +Thanks to all our contributors who have helped make TNE Code better! @@ -216,4 +256,10 @@ Thanks to all our contributors who have helped make Roo Code better! --- -**Enjoy Roo Code!** Whether you keep it on a short leash or let it roam autonomously, we can’t wait to see what you build. If you have questions or feature ideas, drop by our [Reddit community](https://www.reddit.com/r/RooCode/) or [Discord](https://discord.gg/roocode). Happy coding! +## Attribution + +TNE Code is a fork of [Roo Code](https://github.com/RooCodeInc/Roo-Code), originally developed by Roo Code, Inc. We extend our gratitude to the original developers and contributors for their excellent work. + +--- + +**Enjoy TNE Code!** Whether you keep it on a short leash or let it roam autonomously, we can't wait to see what you build. If you have questions or feature ideas, drop by our [Reddit community](https://www.reddit.com/r/RooCode/) or [Discord](https://discord.gg/roocode). Happy coding! diff --git a/apps/vscode-e2e/eslint.config.mjs b/apps/vscode-e2e/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/apps/vscode-e2e/eslint.config.mjs +++ b/apps/vscode-e2e/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/apps/vscode-e2e/package.json b/apps/vscode-e2e/package.json index 5a2c0d0dfc..c88fde9941 100644 --- a/apps/vscode-e2e/package.json +++ b/apps/vscode-e2e/package.json @@ -1,18 +1,18 @@ { - "name": "@roo-code/vscode-e2e", + "name": "@tne-code/vscode-e2e", "private": true, "scripts": { "lint": "eslint src --ext=ts --max-warnings=0", "check-types": "tsc -p tsconfig.esm.json --noEmit", "format": "prettier --write src", - "test:ci": "pnpm -w bundle && pnpm --filter @roo-code/vscode-webview build && pnpm test:run", + "test:ci": "pnpm -w bundle && pnpm --filter @tne-code/vscode-webview build && pnpm test:run", "test:run": "rimraf out && tsc -p tsconfig.json && npx dotenvx run -f .env.local -- node ./out/runTest.js", "clean": "rimraf out .turbo" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", - "@roo-code/types": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", + "@tne-code/types": "workspace:^", "@types/mocha": "^10.0.10", "@types/node": "^22.14.1", "@types/vscode": "^1.95.0", diff --git a/apps/vscode-e2e/tsconfig.esm.json b/apps/vscode-e2e/tsconfig.esm.json index e2f212fab9..fa81247c6a 100644 --- a/apps/vscode-e2e/tsconfig.esm.json +++ b/apps/vscode-e2e/tsconfig.esm.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/base.json", + "extends": "@tne-code/config-typescript/base.json", "compilerOptions": { "outDir": "out" }, diff --git a/apps/vscode-nightly/package.json b/apps/vscode-nightly/package.json index 56872a2aeb..c63c79725d 100644 --- a/apps/vscode-nightly/package.json +++ b/apps/vscode-nightly/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/vscode-nightly", + "name": "@tne-code/vscode-nightly", "description": "Nightly build for the Roo Code VSCode extension.", "private": true, "packageManager": "pnpm@10.8.1", @@ -9,6 +9,6 @@ "clean": "rimraf build .turbo" }, "devDependencies": { - "@roo-code/build": "workspace:^" + "@tne-code/build": "workspace:^" } } diff --git a/apps/vscode-nightly/turbo.json b/apps/vscode-nightly/turbo.json index 543e55aaf7..b79ec5d6d9 100644 --- a/apps/vscode-nightly/turbo.json +++ b/apps/vscode-nightly/turbo.json @@ -3,7 +3,7 @@ "extends": ["//"], "tasks": { "bundle:nightly": { - "dependsOn": ["^build", "@roo-code/vscode-webview#build:nightly"], + "dependsOn": ["^build", "@tne-code/vscode-webview#build:nightly"], "outputs": ["build/**"] }, "vsix:nightly": { diff --git a/apps/web-evals/eslint.config.mjs b/apps/web-evals/eslint.config.mjs index 024d6157d4..f3a259b95d 100644 --- a/apps/web-evals/eslint.config.mjs +++ b/apps/web-evals/eslint.config.mjs @@ -1,4 +1,4 @@ -import { nextJsConfig } from "@roo-code/config-eslint/next-js" +import { nextJsConfig } from "@tne-code/config-eslint/next-js" /** @type {import("eslint").Linter.Config} */ export default [ diff --git a/apps/web-evals/package.json b/apps/web-evals/package.json index 99fa68829c..58318752cc 100644 --- a/apps/web-evals/package.json +++ b/apps/web-evals/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/web-evals", + "name": "@tne-code/web-evals", "version": "0.0.0", "type": "module", "scripts": { @@ -24,8 +24,8 @@ "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", - "@roo-code/evals": "workspace:^", - "@roo-code/types": "workspace:^", + "@tne-code/evals": "workspace:^", + "@tne-code/types": "workspace:^", "@tanstack/react-query": "^5.69.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -47,8 +47,8 @@ "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@tailwindcss/postcss": "^4", "@types/ps-tree": "^1.1.6", "@types/react": "^18.3.23", diff --git a/apps/web-evals/tsconfig.json b/apps/web-evals/tsconfig.json index 546d73aef9..c8dc8202eb 100644 --- a/apps/web-evals/tsconfig.json +++ b/apps/web-evals/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/nextjs.json", + "extends": "@tne-code/config-typescript/nextjs.json", "compilerOptions": { "types": ["vitest/globals"], "plugins": [{ "name": "next" }], diff --git a/apps/web-roo-code/eslint.config.mjs b/apps/web-roo-code/eslint.config.mjs index 9668cb3bae..47ac9a5365 100644 --- a/apps/web-roo-code/eslint.config.mjs +++ b/apps/web-roo-code/eslint.config.mjs @@ -1,4 +1,4 @@ -import { nextJsConfig } from "@roo-code/config-eslint/next-js" +import { nextJsConfig } from "@tne-code/config-eslint/next-js" /** @type {import("eslint").Linter.Config} */ export default [...nextJsConfig] diff --git a/apps/web-roo-code/package.json b/apps/web-roo-code/package.json index d915f3fdf1..c05607c72d 100644 --- a/apps/web-roo-code/package.json +++ b/apps/web-roo-code/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/web-roo-code", + "name": "@tne-code/web-roo-code", "version": "0.0.0", "type": "module", "scripts": { @@ -21,7 +21,7 @@ "@libsql/client": "^0.15.7", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-slot": "^1.2.3", - "@roo-code/types": "workspace:^", + "@tne-code/types": "workspace:^", "@tanstack/react-query": "^5.79.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -44,8 +44,8 @@ "zod": "^3.25.41" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@tailwindcss/typography": "^0.5.16", "@types/node": "^20.17.54", "@types/react": "^18.3.23", diff --git a/apps/web-roo-code/tsconfig.json b/apps/web-roo-code/tsconfig.json index 75ccc2980d..f7d419effe 100644 --- a/apps/web-roo-code/tsconfig.json +++ b/apps/web-roo-code/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/nextjs.json", + "extends": "@tne-code/config-typescript/nextjs.json", "compilerOptions": { "paths": { "@/*": ["./src/*"] } }, diff --git a/docs/run-graphai-implementation-plan.md b/docs/run-graphai-implementation-plan.md new file mode 100644 index 0000000000..ff8d346611 --- /dev/null +++ b/docs/run-graphai-implementation-plan.md @@ -0,0 +1,228 @@ +# Run GraphAI Tool Implementation Plan + +## Overview + +This document outlines the implementation plan for adding a `run_graphai` tool to Roo Code. The tool will execute GraphAI workflow files when they are in the context, similar to how the reference GraphAI debugger VS Code extension works. + +## Background Analysis + +### Current Roo Code Architecture + +- Tools are defined in [`src/shared/tools.ts`](../src/shared/tools.ts) +- Tool implementations are in [`src/core/tools/`](../src/core/tools/) +- Tools are organized into groups: read, edit, browser, command, mcp, modes +- The [`execute_command`](../src/core/tools/executeCommandTool.ts) tool provides a good template for CLI-based tools + +### GraphAI File Structure + +GraphAI files use YAML or JSON format with this structure: +```yaml +agents: + node_name: + agent: agent_type + name: "Display Name" + description: "Node description" + inputs: + input_name: ":source_node" +``` + +### Reference Implementation + +The GraphAI debugger extension executes GraphAI files using: +- CLI command: `graphai ` +- File validation for `.yaml`, `.yml`, `.json` extensions +- Error handling with LLM analysis +- Interactive webview for output display + +## Implementation Plan + +### Phase 1: Core Tool Registration + +```mermaid +graph TD + A[Add run_graphai to ToolName type] --> B[Create RunGraphaiToolUse interface] + B --> C[Add tool to TOOL_DISPLAY_NAMES] + C --> D[Add tool to command group] + D --> E[Create runGraphaiTool.ts implementation] + E --> F[Register tool in presentAssistantMessage.ts] + F --> G[Add tool description] +``` + +### Phase 2: File Changes Required + +#### 1. `src/shared/tools.ts` +- Add `run_graphai: "run graphai workflows"` to `TOOL_DISPLAY_NAMES` +- Create `RunGraphaiToolUse` interface: +```typescript +export interface RunGraphaiToolUse extends ToolUse { + name: "run_graphai" + params: Partial, "path">> +} +``` +- Add to `command` tool group alongside `execute_command` + +#### 2. `src/core/tools/runGraphaiTool.ts` (NEW FILE) +- Similar structure to `executeCommandTool.ts` +- Validate GraphAI file format (`.yaml`, `.yml`, `.json`) +- Execute `graphai ` command using existing terminal infrastructure +- Handle GraphAI-specific error patterns +- Provide enhanced error messages for common GraphAI issues + +#### 3. `src/core/assistant-message/presentAssistantMessage.ts` +- Add case for `"run_graphai"` in tool execution switch +- Add tool name display logic + +#### 4. `src/core/prompts/tools/run-graphai.ts` (NEW FILE) +- Create tool description following existing patterns +- Add to `src/core/prompts/tools/index.ts` + +### Phase 3: Tool Implementation Details + +#### File Validation Logic +```typescript +function isValidGraphAIFile(filePath: string): boolean { + const ext = path.extname(filePath).toLowerCase() + return ['.yaml', '.yml', '.json'].includes(ext) +} + +function validateGraphAIContent(content: string, filePath: string): boolean { + // Parse and validate GraphAI structure + // Check for required sections (agents/nodes) + // Return validation result +} +``` + +#### Command Execution +```typescript +// Similar to executeCommandTool but with GraphAI-specific handling +const command = `graphai "${filePath}"` +// Execute using existing terminal infrastructure +// Parse GraphAI-specific output and errors +``` + +#### Tool Description Format +```markdown +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. + +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute + +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + +``` + +### Phase 4: Enhanced Features + +#### GraphAI-Specific Enhancements +1. **File Validation** + - Check if file is a valid GraphAI YAML/JSON + - Validate basic GraphAI structure (has `agents` or `nodes` section) + - Provide helpful error messages for invalid files + +2. **Context Awareness** + - Auto-detect GraphAI files in workspace + - Suggest running GraphAI when GraphAI files are in context + - Integration with file reading tools + +3. **Error Handling** + - Parse GraphAI-specific error messages + - Provide suggestions for common GraphAI issues + - Integration with existing error handling patterns + +## Implementation Strategy + +### Step 1: Basic Tool Registration +1. Add tool definition to shared types +2. Create basic tool implementation +3. Register in tool execution pipeline + +### Step 2: CLI Integration +1. Implement GraphAI CLI execution +2. Handle file validation +3. Process command output + +### Step 3: Error Handling +1. Add GraphAI-specific error parsing +2. Implement helpful error messages +3. Integration with existing error patterns + +### Step 4: Context Integration +1. Auto-detection of GraphAI files +2. Smart suggestions when GraphAI files are present +3. Integration with file reading tools + +## Integration Points + +### With Existing Tools +- `read_file` for reading GraphAI files +- `execute_command` for CLI execution patterns +- `list_files` for discovering GraphAI files + +### With Tool Groups +- Add to `command` group alongside `execute_command` +- Consider creating a new `graphai` group if more GraphAI tools are planned + +### With Error Handling +- Leverage existing error handling infrastructure +- Add GraphAI-specific error patterns and suggestions + +## Future Enhancements + +### Advanced GraphAI Integration +- Direct npm package usage for better control +- GraphAI workflow visualization +- Interactive debugging capabilities + +### Workflow Management +- GraphAI workflow templates +- Workflow validation and linting +- Performance monitoring + +### AI-Powered Features +- Automatic workflow generation +- Error analysis and suggestions +- Workflow optimization recommendations + +## Testing Strategy + +### Unit Tests +- Test file validation logic +- Test command execution +- Test error handling + +### Integration Tests +- Test with sample GraphAI files +- Test error scenarios +- Test tool registration + +### Manual Testing +- Test with reference GraphAI files +- Test error handling with invalid files +- Test integration with other tools + +## Success Criteria + +1. ✅ Tool successfully registered in Roo Code +2. ✅ Can execute valid GraphAI YAML/JSON files +3. ✅ Provides helpful error messages for invalid files +4. ✅ Integrates seamlessly with existing tool ecosystem +5. ✅ Follows Roo Code coding patterns and conventions +6. ✅ Includes comprehensive documentation and tests + +## Implementation Notes + +- Follow existing patterns from `executeCommandTool.ts` +- Ensure proper error handling and user feedback +- Maintain consistency with Roo Code's tool architecture +- Consider future extensibility for advanced GraphAI features +- Leverage existing terminal and command execution infrastructure + +This implementation will provide a solid foundation for GraphAI workflow execution within Roo Code while maintaining consistency with existing patterns and allowing for future enhancements. \ No newline at end of file diff --git a/graphai-setup.md b/graphai-setup.md new file mode 100644 index 0000000000..fbfec12fde --- /dev/null +++ b/graphai-setup.md @@ -0,0 +1,865 @@ +## GraphAI Environment + +As TNE-Code, our organization's resident application development agent, you are well-versed in our standard develpment practices and can implement them yourself like a senior developer. + +We build full-stack, AI-powered applications using GraphAI as our LLM orchestration tool. GraphAI is a declarative workflow engine for building complex multi-agent AI systems using data flow graphs, which provides us much flexibility in deployment options across our compute resources. + +Here a simple example of GraphAI. + +```YAML +version: 0.5 +nodes: + userPrompt: + value: "" + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + isResult: true +``` + +As you develop full-stack applications, you must adhere to the following guidelines when writing code so that it is compatible with our development practices and cloud infrastructure. + +### Tooling standards + +Our organization uses `graphai` as our standard LLM orchestration package, `vite` as our development environment for frontend assets, and `yarn` as our package manager. + +The following `package.json` should be used as a starting point for project dependencies. Note the use of `vite`, `rollup`, and `React`, as well as the GraphAI imports. + +```json +{ + "name": "", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint src", + "lint-fix": "eslint src --ext js,jsx,ts,tsx --report-unused-disable-directives --fix", + "tsc-watch": "npx tsc -noEmit --watch", + "preview": "vite preview", + "test": "vitest" + }, + "dependencies": { + "@graphai/agent_filters": "^2.0.0", + "@graphai/http_client_agent_filter": "^2.0.1", + "@graphai/llm_agents": "^2.0.1", + "@graphai/service_agents": "^2.0.1", + "@graphai/stream_agent_filter": "^2.0.2", + "@graphai/vanilla": "^2.0.4", + "@tne/tne-agent-v2": "file:../packages/tne-tne-agent-v2-0.0.1.j.tgz", + "graphai": "^2.0.5", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.6.2", + "typescript": "^4.9.5", + "yaml": "^2.8.0", + "zustand": "^5.0.5" + }, + "devDependencies": { + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-sucrase": "^5.0.2", + "@rollup/plugin-typescript": "^12.1.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.126", + "@types/react": "^19.1.6", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.1", + "rollup": "^3.25.0", + "rollup-plugin-postcss": "^4.0.0", + "vite": "^5.1.4", + "vite-plugin-checker": "^0.6.4", + "vitest": "^1.3.1" + }, + "browserslist": { + "production": [">0.2%", "not dead", "not op_mini all"], + "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] + } +} +``` + +The following `vite.config.js` should be used as a starting point. + +```javascript +import { defineConfig, loadEnv } from "vite" +import react from "@vitejs/plugin-react" +import checker from "vite-plugin-checker" +import { resolve } from "path" + +// https://vitejs.dev/config/ +export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + + return { + base: "/", + build: { + outDir: "dist", + assetsDir: "assets", + commonjsOptions: { transformMixedEsModules: true }, + rollupOptions: { + output: { + manualChunks: { + vendor: ["react", "react-dom"], + graphai: ["graphai", "@graphai/vanilla", "@graphai/llm_agents"], + // Only include packages that are actually installed: + // mui: ['@mui/material', '@mui/icons-material', '@mui/x-data-grid'], + // charts: ['recharts'], + }, + }, + }, + }, + plugins: [ + react(), + checker({ + typescript: true, + eslint: { + lintCommand: "eslint", + }, + }), + ], + define: { + global: "globalThis", + }, + resolve: { + alias: { + "@": resolve(__dirname, "src"), + async_hooks: "async_hooks-browserify", + }, + }, + optimizeDeps: { + exclude: ["@graphai/agent_filters"], + }, + } +}) +``` + +You'll also need a `src/vite-env.d.ts` file: + +```typescript +/// + +interface ImportMetaEnv { + readonly VITE_USE_SERVER_AGENTS?: string; + readonly VITE_GRAPHAI_SERVER_URL?: string; + readonly VITE_OPENAI_API_KEY?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +``` + +The following `rollup.config.js` should be used as a starting point. + +```javascript +import path from "path" +import { fileURLToPath } from "url" +import alias from "@rollup/plugin-alias" +import resolve from "@rollup/plugin-node-resolve" +import commonjs from "@rollup/plugin-commonjs" +import postcss from "rollup-plugin-postcss" +import json from "@rollup/plugin-json" +import sucrase from "@rollup/plugin-sucrase" + +// Convert import.meta.url to __dirname +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +export default { + input: "src/main.tsx", + output: { + dir: "dist", + format: "iife", // Use 'iife' for a self-executing function suitable for browsers + name: "", // Name of the global variable for your app + sourcemap: true, + }, + plugins: [ + alias({ + entries: [{ find: "@", replacement: path.resolve(__dirname, "src") }], + }), + resolve({ + browser: true, // Ensure resolution of browser-compatible modules + preferBuiltins: false, // Disable Node.js built-ins + }), + commonjs({ + include: /node_modules/, // Include all dependencies in node_modules + requireReturnsDefault: "auto", // Attempt to automatically handle default exports + }), + json(), + postcss({ + extensions: [".css"], + }), + sucrase({ + exclude: ["node_modules/**", "**/*.css", "**/*.json"], + transforms: ["typescript", "jsx"], + }), + ], + context: "window", + watch: { + chunkSizeWarningLimit: 1000, + }, +} +``` + +The following `tsconfig.json` should be used as a starting point. + +```json +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ES2020", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": "src", + "paths": { + "@/*": ["./*"] + }, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Additional options for compatibility */ + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] +} +``` + +The following `tsconfig.node.json` should be used as a starting point. + +```json +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ES2020", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true, + "allowJs": true + }, + "include": ["vite.config.*", "*.config.*"], + "exclude": ["node_modules", "dist"] +} +``` + +## GraphAI Integration + +This section demonstrates how to integrate GraphAI into a TypeScript application with environment-aware configuration. The service automatically adapts between local development and production environments using the environment variable management system. + +### Important: React Import Configuration + +When using React 17+ with the new JSX transform, you should **NOT** import React directly in your components. Instead: + +**❌ Don't do this:** + +```typescript +import React, { useState } from "react" +``` + +**✅ Do this instead:** + +```typescript +import { useState } from "react" +``` + +**For main.tsx, use StrictMode directly:** + +```typescript +import { StrictMode } from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) +``` + +### Vite Environment Types + +Create a `src/vite-env.d.ts` file to properly configure TypeScript for Vite and React: + +```typescript +/// +/// +/// + +interface ImportMetaEnv { + readonly MODE: string + readonly BASE_URL: string + readonly PROD: boolean + readonly DEV: boolean + readonly VITE_USE_SERVER_AGENTS?: string + readonly VITE_GRAPHAI_SERVER_URL?: string + readonly VITE_OPENAI_API_KEY?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} +``` + +### GraphAI Service Implementation + +```typescript +import { streamAgentFilterGenerator } from "@graphai/stream_agent_filter" +import { httpAgentFilter } from "@graphai/http_client_agent_filter" +import { GraphAI, AgentFunctionContext } from "graphai" +import { openAIAgent } from "@graphai/llm_agents" +import * as agents from "@graphai/vanilla" +import { fetchAgent } from "@graphai/service_agents" +import * as YAML from "yaml" +import { getAppConfig, AppConfig } from "../config/environment" + +// Define interfaces for your data and responses +interface DataItem { + id: string + name: string + category: string + metadata: Record +} + +interface GraphAIResponse { + success: boolean + result?: string + error?: string +} + +class GraphAIService { + private allAgents: any + private config: any + private workflow: any + private appConfig: AppConfig + + constructor() { + // Load environment configuration + this.appConfig = getAppConfig() + + // Create comprehensive agent collection + // Only include openAIAgent for local development + this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, + } + + // Create configuration for agents + // Only configure openAI for local development + this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } + + // Load the workflow + this.loadWorkflow() + } + + /** + * Load the GraphAI workflow from YAML file + */ + private async loadWorkflow(): Promise { + try { + const response = await fetch("/your-workflow.yaml") + const workflowContent = await response.text() + this.workflow = YAML.parse(workflowContent) + } catch (error) { + console.error("Failed to load workflow:", error) + } + } + + /** + * Format structured data for GraphAI workflows + * This demonstrates how to prepare any type of data for injection + */ + private formatDataCollection(items: DataItem[]): string { + return items + .map((item) => { + return ` +Item: ${item.name} (ID: ${item.id}) +Category: ${item.category} +Metadata: ${JSON.stringify(item.metadata, null, 2)} +---` + }) + .join("\n") + } + + /** + * Execute workflow with environment-aware configuration + */ + async executeGraphAI( + query: string, + data: DataItem[], + onStream: (response: string) => void, + ): Promise { + try { + // Ensure workflow is loaded + if (!this.workflow) { + await this.loadWorkflow() + } + + let lastNodeId: string | null = null + const streamCallback = (context: AgentFunctionContext, token: string) => { + console.log(token) + if (context.debugInfo.nodeId !== lastNodeId && lastNodeId !== null) { + onStream("\n\n") + } + lastNodeId = context.debugInfo.nodeId + onStream(token) + } + + // Agent filters for processing + const streamAgentFilter = streamAgentFilterGenerator(streamCallback) + + // Configure server agents based on environment + const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + + const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, + ] + + // Format your data for injection + const dataCollectionText = this.formatDataCollection(data) + + const graphai = new GraphAI(this.workflow, this.allAgents, { + agentFilters: agentFilters, + config: this.config, + }) + + // Inject values + graphai.injectValue("userPrompt", query) + graphai.injectValue("dataCollection", dataCollectionText) + + /* + CRITICAL: Use injectValue() to pass data into + your workflow. This allows you to inject any type of data: + structured data, images, files, etc. + + You can inject multiple types of data: + graphai.injectValue("imageData", base64ImageString); + graphai.injectValue("fileContent", fileContentString); + graphai.injectValue("contextData", JSON.stringify(contextObject)); + + Note that the static node type must match the injected data. + To inject an array object, the static node must look like: + + nodeName: + value: [] + */ + + // Logging with environment context + graphai.onLogCallback = ({ nodeId, agentId, state, errorMessage: errorMessage }) => { + if (!errorMessage) { + console.log( + `${nodeId} ${agentId} ${state} (${this.appConfig.useServerAgents ? "server" : "local"})`, + ) + } else { + console.log(`ERROR: ${nodeId} ${agentId} ${state}: ${errorMessage}`) + } + } + + const result = await graphai.run() + + return { + success: true, + result: this.formatGraphAIResult(result), + } + } catch (error) { + console.error("GraphAI error:", error) + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error occurred", + } + } + } + + /** + * Format GraphAI result for display + */ + private formatGraphAIResult(result: any): string { + if (result && typeof result === "object") { + const resultKeys = Object.keys(result) + if (resultKeys.length > 0) { + // Return the first result node's content + const firstKey = resultKeys[0] + const firstResult = result[firstKey] + + if (typeof firstResult === "string") { + return firstResult + } else if (firstResult && firstResult.text) { + return firstResult.text + } else { + return JSON.stringify(firstResult, null, 2) + } + } + } + + return typeof result === "string" ? result : JSON.stringify(result, null, 2) + } + + /** + * Get current configuration info for debugging + */ + getConfigInfo(): { environment: string; useServerAgents: boolean; serverUrl: string } { + return { + environment: this.appConfig.isProduction ? "production" : "development", + useServerAgents: this.appConfig.useServerAgents, + serverUrl: this.appConfig.graphaiServerUrl, + } + } +} + +const graphAIServiceInstance = new GraphAIService() +export default graphAIServiceInstance +``` + +## Using the GraphAI Service in React + +Here's a minimal example showing how to import and use the GraphAI service in a React component: + +```typescript +import { useState, useCallback } from 'react'; +import graphaiService, { GraphAIResponse } from '../services/graphaiService'; + +const AIComponent: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + const [response, setResponse] = useState(''); + const [error, setError] = useState(''); + + // Your application data + const data: DataItem[] = []; // Replace with your actual data + + const handleQuery = useCallback(async (query: string) => { + if (!query.trim()) return; + + // Clear previous state before starting new query + setError(''); + setResponse(''); + setIsLoading(true); + + try { + // Track if we've received the first token to improve UX + let hasReceivedFirstToken = false; + + // Stream callback for real-time updates + const onStream = (token: string) => { + // Stop loading spinner as soon as first token arrives for better UX + // This allows users to see content appearing immediately + if (!hasReceivedFirstToken) { + hasReceivedFirstToken = true; + setIsLoading(false); + } + + setResponse(prev => prev + token); + }; + + // Execute GraphAI workflow + const result: GraphAIResponse = await graphaiService.executeGraphAI( + query, + data, + onStream + ); + + if (result.success && result.result) { + // Ensure final complete response is displayed + // This handles cases where streaming doesn't work or is incomplete + setResponse(result.result); + } else if (!result.success && result.error) { + setError(result.error); + setResponse(''); + } + } catch (error) { + console.error('GraphAI error:', error); + setError(error instanceof Error ? error.message : 'An unexpected error occurred'); + setResponse(''); + } finally { + // Always stop loading at the end as a safety net + setIsLoading(false); + } + }, [data]); + + return ( +
+ e.key === 'Enter' && handleQuery(e.currentTarget.value)} + placeholder="Ask anything..." + /> + + + {isLoading &&

Loading...

} + {error &&

{error}

} + {response && ( +
+ {response} + {isLoading && |} {/* Show cursor while streaming */} +
+ )} +
+ ); +}; +``` + +## Environment Variable Management + +### Overview + +The GraphAI application uses a sophisticated environment variable management system that adapts between local development and production deployment environments. Environment variables control how GraphAI agents are configured and whether they run locally or on remote servers. + +### Environment Configuration Structure + +#### Key Environment Variables + +- **`VITE_USE_SERVER_AGENTS`**: Controls whether to use server-side GraphAI agents or local agents +- **`VITE_GRAPHAI_SERVER_URL`**: URL endpoint for the GraphAI server when using server agents +- **`VITE_OPENAI_API_KEY`**: OpenAI API key for local development (only used when not using server agents) + +#### Environment Detection Logic + +```typescript +const isProduction = import.meta.env.PROD +const useServerAgents = import.meta.env.VITE_USE_SERVER_AGENTS === "true" || isProduction + +const config = { + isProduction, + useServerAgents, + graphaiServerUrl: import.meta.env.VITE_GRAPHAI_SERVER_URL || "http://localhost:8085/agents", + openaiApiKey: useServerAgents ? undefined : import.meta.env.VITE_OPENAI_API_KEY, +} +``` + +### GraphAI Service Integration + +This component automatically adapts its configuration based on environment variables: + +#### Agent Configuration + +```typescript +// Agent collection - same for all environments +this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, +} + +// Configuration adapts based on environment +this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } +``` + +#### Server Agent Filtering + +When using server agents, the service configures HTTP agent filters to route specific agents to the remote server: + +```typescript +// Configure server agents based on environment +const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + +const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, +] +``` + +### Environment Files + +The application supports different environment configurations: + +- **Development**: Uses local OpenAI API key, agents run in browser +- **Production**: Uses server agents, no API key needed in browser + +#### Vite Configuration + +The [`vite.config.js`](wine-cellar-app/vite.config.js) automatically loads environment variables: + +```javascript +export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + // Environment variables are automatically available as import.meta.env.* +}) +``` + +### Debugging Environment Variables + +The environment configuration includes comprehensive logging for debugging: + +```typescript +console.log("=== Environment Variables Debug ===") +console.log("import.meta.env.PROD:", import.meta.env.PROD) +console.log("import.meta.env.DEV:", import.meta.env.DEV) +console.log("import.meta.env.MODE:", import.meta.env.MODE) +console.log("import.meta.env.VITE_USE_SERVER_AGENTS:", import.meta.env.VITE_USE_SERVER_AGENTS) +console.log("import.meta.env.VITE_GRAPHAI_SERVER_URL:", import.meta.env.VITE_GRAPHAI_SERVER_URL) +console.log("===================================") +``` + +Use the following defaults for your server configuration (both `dev` and `prod` deployments). + +```shell +# Development/staging environment +# Use server-side GraphAI processing +VITE_USE_SERVER_AGENTS=true +VITE_GRAPHAI_SERVER_URL=https://graphai.dev.tne.ai/agents +``` + +## Deployment with tne-ci-mcp Server + +### Overview + +Deployment is handled through the **tne-ci-mcp** MCP server, which provides automated deployment tools for AWS S3 and Kubernetes. If not available, alert the user that it must be installed [here](https://github.com/tne-ai/tne-ci-mcp). + +### Available MCP Tools + +The tne-ci-mcp server provides three main deployment tools: + +#### 1. deploy-app + +Deploys the application to AWS S3 and sets up Kubernetes routing. + +#### 2. cleanup-app + +Removes all deployed resources from AWS and Kubernetes. + +#### 3. check-deployment-status + +Checks the current deployment status across environments. + +### Deployment Architecture + +#### Domain Structure + +- **Development**: `{app-name}.dev.tne.ai` +- **Production**: `{app-name}.tne.ai` + +#### Infrastructure Components + +- **S3 Bucket**: Static website hosting with public read access +- **VirtualService**: Routes custom domain to S3 website endpoint +- **ServiceEntry**: Allows Istio to route to external S3 endpoint +- **Shared Ingress Gateway**: Handles SSL termination and routing + +### Environment-Specific Deployment + +The MCP deployment tools automatically handle environment-specific configurations: + +#### Development Deployment + +```typescript +await use_mcp_tool("tne-ci", "deploy-app", { + projectPath: "./wine-cellar-app", + environment: "dev", +}) +``` + +This creates: + +- S3 bucket: `wine-cellar-dev` +- Domain: `wine-cellar.dev.tne.ai` +- VirtualService: `wine-cellar-dev` in `dev` namespace + +#### Production Deployment + +```typescript +await use_mcp_tool("tne-ci", "deploy-app", { + projectPath: "./wine-cellar-app", + environment: "prod", +}) +``` + +This creates: + +- S3 bucket: `wine-cellar-prod` +- Domain: `wine-cellar.tne.ai` +- VirtualService: `wine-cellar-prod` in `prod` namespace + +### Prerequisites + +Before using the MCP deployment tools, ensure: + +1. **AWS CLI** configured with appropriate permissions +2. **kubectl** connected to your Kubernetes cluster +3. **Node.js & npm** for building the application +4. **tne-ci-mcp server** connected and available + +#### Common Issues + +1. **MCP Server Connection**: Ensure tne-ci-mcp server is running and connected +2. **AWS Permissions**: Verify AWS CLI has S3, CloudFront, and Route 53 permissions +3. **Kubernetes Access**: Check kubectl connection and namespace permissions +4. **Build Failures**: Ensure Node.js dependencies are installed and environment variables are set diff --git a/graphai.md b/graphai.md new file mode 100644 index 0000000000..61428bc0a8 --- /dev/null +++ b/graphai.md @@ -0,0 +1,294 @@ +# GraphAI Tutorial + +## Hello World + +[GraphAI](https://github.com/receptron/graphai) is an open source project, which allows non-programmers to build AI applications by describing data flows in a declarative language, GraphAI. + +Here a simple example of GraphAI. + +```YAML +version: 0.5 +nodes: + llm1: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: Explain ML's transformer in 100 words. + isResult: true + llm2: + agent: openAIAgent + params: + model: gpt-4o + inputs: + system: Provide a a 50 word summary of your input. + prompt: :llm1.text + isResult: true +``` + +It has two nodes: + +1. **llm1**: This node is associated with "openAIAgent", which calls OpenAI's chat completion API. It takes "Explain ML's transformer in 100 words." as an input (the user prompt) and outputs the result from the chat completion API. +2. **llm2**: This node receives the output of the **llm2** node, as an input, and performs an additional LLM call to summarize tie 100 words down to 50. + +Notice that **llm1** node will be executed immediately because all the inputs are available at the beginning, while **llm2** node will be executed when the data from **llm1** node becomes available. If `llm2` did not accept input from `llm1`, and instead had a `prompt` of `:userPrompt`, the two nodes would execute concurrently. + +Because `isResult` is set to true from **llm1** and **llm2**, both will display to the console. + +## Computed Node and Static Node + +There are two types of nodes in GraphAI, _computed nodes_ and _static nodes_. + +A computed node is associated with an _agent_, which performs a certain computation. Both nodes in the previous examples are _computed nodes_. + +A _static nodes_ is a place holder of a value, just like a _variable_ in computer languages. + +In our organization, it is convention that a single message is passed into the LLM workflow by using a static node called `userPrompt`. Entire chat histories (represented by an array of OpenAI-style messages with a `role` and `content`) are passed in through the `chatHistory` static node. + +When creating a workflow that has a placeholder to accept user input in either of these forms, initialize an empty `userPrompt` and/or `chatHistory` node as follows. + +```YAML +nodes: + userPrompt: + value: "" + chatHistory: + value: [] +``` + +The example below performs a similar operation as the previous example, but uses one _static node_, **userPrompt**, which holds the value "Explain ML's transformer in 100 words". + +```YAML +version: 0.5 +nodes: + userPrompt: + value: Explain ML's transformer in 100 words. + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + output: + agent: copyAgent + params: + namedKey: text + console: + after: true + inputs: + text: :llm.text + +``` + +## Loop / Mapping + +The dataflow graph needs to be acyclic by design, but we added a few control flow mechanisms, such as loop, nesting, if/unless and mapping (of map-reduce). Note the syntax to access `:shift.item` inside a string. + +### Loop + +Here is a simple application, which uses **loop**. + +```YAML +version: 0.5 +loop: + while: :fruits +nodes: + fruits: + value: + - apple + - lemon + - banana + update: :shift.array + result: + value: [] + update: :reducer.array + isResult: true + shift: + agent: shiftAgent + inputs: + array: :fruits + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: What is the typical color of ${:shift.item}? Just answer the color. + isResult: true + reducer: + agent: pushAgent + inputs: + array: :result + item: :llm.text + +``` + +1. **fruits**: This static node holds the list of fruits at the beginning but updated with the array property of **shift** node after each iteration. +2. **result**: This static node starts with an empty array, but updated with the value of **reducer** node after each iteration. +3. **shift**: This node takes the first item from the value from **fruits** node, and output the remaining array and item as properties. +4. **llm**: This computed node generates a prompt using the template "What is the typical color of ${:shift.item}? Just answer the color." by applying the item property from the shift node's output. It then passes this prompt to gpt-4o to obtain the generated result. +5. **reducer**: This node pushes the content from the output of **llm** node to the value of **result** node. + +Please notice that each item in the array will be processed sequentially. To process them concurrently, see the section below. + +## Parallel Execution + S3 File Access + +This example uses `s3FileAgent` to access images in S3. In this case, the images contain tabular data, and `mapAgent` is used to perform OCR in parallel for each image. The extracted tables from each image are combined into a single result. + +Use `mapAgent` for processes which take a list as input, when the objective is to process all list items concurrently. Use a traditional loop for iterative processing. + +```YAML +version: 0.5 +nodes: + imageData1: + agent: s3FileAgent + params: + fileName: image input 1.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData2: + agent: s3FileAgent + params: + fileName: image input 2.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData3: + agent: s3FileAgent + params: + fileName: image input 3.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageExtractor: + agent: mapAgent + inputs: + rows: + - ":imageData1.imageData" + - ":imageData2.imageData" + - ":imageData3.imageData" + params: {} + graph: + version: 0.5 + nodes: + imageExtraction: + agent: openAIAgent + inputs: + messages: + - role: user + content: + - type: image_url + image_url: + url: "${:row}" + system: From the given image(s), extract the tabular data in a CSV format. + console: true + filterExtraction: + agent: copyAgent + inputs: + text: ":imageExtraction.text" + params: + namedKey: text + isResult: true + console: true + aggregateImageExtraction: + agent: jsonParserAgent + inputs: + data: ":imageExtractor" + console: true + synthesizeLlm: + agent: openAIAgent + inputs: + prompt: ":aggregateImageExtraction.text" + system: From the given list, synthesize all tabular data into one or more tables + isResult: true + console: true +``` + +## Nested Workflows + Conditional Logic + +### Nesting + +A node can itself be a GraphAI workflow, which is executed through `nestedAgent`. The following example uses `fetchAgent` to pull documentation from the given URLs, then generates a GraphAI workflow, which is executed through the use of `nestedAgent`. + +### Conditional logic + +Computed nodes can execute upon a condition being met using `if`/`unless` syntax and `compareAgent`. In this example, the `fetchAPI` node returns `True` if the user is asking a question that may require external APIs (like the current weather), otherwise `False` if it can be answered with general knowledge. The `checkAPICallNeeded` node evaluates to `True` if the `fetchAPI.text` value is not `False`. Nodes can now use `if`/`unless` syntax to conditionally execute based off of this evaluation. + +````YAML +version: 0.5 +nodes: + userPrompt: + value: "" + + llmEngine: + value: "openAIAgent" + + fetchAPI: + agent: ":llmEngine" + inputs: + prompt: ":userPrompt" + system: >- + You are capable of either returning True or False. Return True if the user is asking for information which would require external knowledge, and False otherwise. + + checkAPICallNeeded: + agent: compareAgent + inputs: + array: [":fetchAPI.text", "!=", "False"] + + conversationLLM: + agent: ":llmEngine" + inputs: + system: You are a helpful chat assistant. + prompt: ":userPrompt" + unless: ":checkAPICallNeeded.result" + isResult: true + + document: + agent: fetchAgent + console: + before: "...fetching document" + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/main/packages/graphai/README.md + + sampleGraph: + agent: fetchAgent + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/refs/heads/main/packages/samples/src/net/weather.ts + + graphGenerator: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - >- + You an expert in GraphAI programming. You are responsible in generating a graphAI graph to answer the user question. Always store the results in a node called 'output', with isResult set to true. + - "graphAI graph outputs in json format" + - "[documentation of GraphAI]\n${:document}" + - "[sample graph]\n```json\n${:sampleGraph}\n```" + - "For weather, directly input the latitude/longitude into the GraphAI graph you write" + params: + temperature: 0 + isResult: true + + execute: + if: ":checkAPICallNeeded.result" + agent: nestedAgent + graph: ":graphGenerator.text.codeBlock().jsonParse()" + + summarize: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - "Output to summarize:\n\n" + - ":execute.output" + - "Instructions\n\n" + - "Succinctly summarize the data you've received to answer the user question in the chat history." + isResult: true +``` +```` diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md new file mode 100644 index 0000000000..d8f9bfb6b1 --- /dev/null +++ b/memory-bank/activeContext.md @@ -0,0 +1,32 @@ +# Active Context + +This file tracks the project's current status, including recent changes, current goals, and open questions. +2025-12-06 06:28:11 - Memory Bank initialization in progress + +## Current Focus + +- **Understanding Existing Codebase**: Analyzing Roo Code VSCode extension architecture and structure +- **Documentation Phase**: Creating comprehensive documentation of the monorepo structure +- **Memory Bank Setup**: Establishing project context and development workflow documentation + +## Recent Changes + +- 2025-12-06 06:28:11 - Memory Bank initialized for comprehensive project documentation +- 2025-12-06 06:28:11 - Starting TNE0 mode analysis of existing Roo Code extension + +## Open Questions/Issues + +- Need to analyze source code structure in [`src/`](src/) directory +- Determine database schema and relationships (if any) +- Document user interface components and screens in [`webview-ui/`](webview-ui/) +- Identify missing Makefile and create development workflow automation +- Analyze testing patterns and coverage across jest/vitest transition +- Document MCP (Model Context Protocol) integration patterns +- Map out monorepo workspace relationships and dependencies + +## Recent Changes + +[2025-06-12 06:38:55] - Updated README.md to rebrand from Roo Code to TNE Code with proper attribution to original project +[2025-06-12 06:40:49] - Found and analyzed mode configuration system - most prompts already updated to TNE-Code, only minor references in LM Studio provider remain + +[2025-12-06 10:57:34] - Current Focus: TNE Code branding standardization with 4-phase implementation plan ready for execution diff --git a/memory-bank/decisionLog.md b/memory-bank/decisionLog.md new file mode 100644 index 0000000000..2b1730c297 --- /dev/null +++ b/memory-bank/decisionLog.md @@ -0,0 +1,82 @@ +# Decision Log + +This file records architectural and implementation decisions using a list format. +2025-12-06 06:28:45 - Memory Bank initialization progressing + +## Decision + +**Memory Bank Architecture for Roo Code Documentation** + +- 2025-12-06 06:28:45 - Established comprehensive Memory Bank structure for project documentation +- 2025-12-06 06:28:45 - Decided to use markdown-based documentation with timestamped entries + +## Rationale + +The Memory Bank approach provides: + +- **Persistent Context**: Maintains project knowledge across different development sessions +- **Cross-Mode Compatibility**: Supports all Roo Code modes (Architect, Code, Debug, etc.) +- **Incremental Documentation**: Allows progressive understanding and documentation of complex codebases +- **Structured Knowledge**: Organizes information into specific categories (product context, active work, progress, decisions, patterns) + +## Implementation Details + +**File Structure:** + +- [`productContext.md`](memory-bank/productContext.md) - High-level project overview and goals +- [`activeContext.md`](memory-bank/activeContext.md) - Current status and immediate focus areas +- [`progress.md`](memory-bank/progress.md) - Task tracking and completion status +- [`decisionLog.md`](memory-bank/decisionLog.md) - Architectural and implementation decisions +- [`systemPatterns.md`](memory-bank/systemPatterns.md) - Code patterns and architectural standards + +**Planned Specialized Files:** + +- [`tne0-existing-code.md`](memory-bank/tne0-existing-code.md) - Comprehensive source code analysis +- [`devPrompts.md`](memory-bank/devPrompts.md) - Development prompt history tracking + +**Integration with TNE0 Mode Requirements:** + +- Source location analysis ([`src/`](src/) directory structure) +- Technology stack documentation (TypeScript, React, pnpm monorepo) +- Development workflow automation (Makefile creation) +- Testing strategy documentation (Jest to Vitest transition) +- UI/UX pattern documentation +- Database schema analysis (if applicable) + +[2025-06-12 07:04:30] - **Decision: Created Development Makefile** + +## Rationale + +Added [`Makefile`](Makefile) to streamline TNE Code extension development workflow. The Makefile provides: + +- **Standardized Commands**: `make install`, `make dev`, `make test`, `make build`, etc. +- **Developer Onboarding**: Clear instructions for environment setup and workflow +- **Monorepo Integration**: Proper pnpm workspace command orchestration +- **Documentation**: Self-documenting help system with `make help` +- **Security Considerations**: Guidelines for environment variable management with 1Password CLI + +## Implementation Details + +**Key Features:** + +- 15 development commands covering full lifecycle (install → dev → test → build → package) +- Integration with existing pnpm/Turborepo build system +- Support for VSCode extension development workflow (F5 debugging, VSIX packaging) +- Clean separation of development, testing, and production concerns +- Environment variable management recommendations (direnv, 1Password CLI) + +**Commands Added:** + +- `make install` - Dependencies and environment setup +- `make dev` - Development mode with file watching +- `make test` - Test execution across workspaces +- `make build` - Production build +- `make vsix` - VSCode extension packaging +- `make clean` - Build artifact cleanup +- Additional utility commands for linting, formatting, type checking + +This addresses the previous gap in development workflow automation identified in the Memory Bank. + +[2025-12-06 10:57:54] - **Decision**: TNE Code Branding Strategy +**Rationale**: Maintain clean separation between internal technical naming (@roo-code/) and external brand presentation (TNE Code) +**Implementation Details**: 4-phase approach starting with package.json fixes, then UI verification, internal consistency, and testing diff --git a/memory-bank/devPrompts.md b/memory-bank/devPrompts.md new file mode 100644 index 0000000000..75b2ad1ce1 --- /dev/null +++ b/memory-bank/devPrompts.md @@ -0,0 +1,74 @@ +# Development Prompts + +This file tracks all prompts from users with date, time, mode and model being used. + +## Session Log + +**2025-12-06 06:30:24** + +- **Mode**: tne0-document-existing-data (📖TNE0. Understand Existing) +- **Model**: claude-sonnet-4-20250514 +- **User Prompt**: "understand this extension" +- **Context**: Initial request to analyze and document the Roo Code VSCode extension +- **Response**: Memory Bank initialization and comprehensive codebase analysis beginning + +## Prompt Analysis + +**User Intent**: Comprehensive understanding of the Roo Code VSCode extension codebase +**Expected Deliverables**: + +- Source code structure analysis +- Technology stack documentation +- Development workflow setup +- Architecture diagrams +- UI/UX documentation +- Missing component identification +- Makefile creation for streamlined development + +**Follow-up Questions for Future Sessions**: + +- Specific areas of the codebase requiring deeper analysis +- Performance optimization opportunities +- Security audit requirements +- Feature enhancement requests +- Integration testing strategy + [2025-12-06 06:44:02] - Mode: tne0-document-existing-data, Model: claude-sonnet-4-20250514 + User Prompt: "look for the tne research mode" + [2025-12-06 06:54:18] - Mode: code, Model: claude-sonnet-4-20250514 + User Prompt: "git commit with extensive comments and push and issue a pr" + User Feedback: "The pr target is main, fix the role definition too" + +[2025-06-12 07:05:10] - Mode: code, Model: claude-sonnet-4-20250514 +User Prompt: "add Makefile and note its creation" +Context: Adding Makefile to git staging and documenting its creation in memory bank + +## TNE Code Branding Standardization Architecture Session + +**Date:** 2025-12-06 10:58:05 +**Mode:** Architect +**Model:** claude-sonnet-4-20250514 + +### User Request Summary + +Continue from branding standardization task with approval to proceed with 4-phase implementation plan. + +### Key Prompts and Context + +1. **Initial Context**: User provided comprehensive summary of TNE Code branding standardization task +2. **Plan Approval**: User confirmed 4-phase approach (package naming, UI verification, internal consistency, testing) +3. **Strategy Clarification**: Keep internal identifiers as `@roo-code/` while external UI shows "TNE Code" + +### Deliverables Created + +- [`memory-bank/tne-branding-standardization-plan.md`](memory-bank/tne-branding-standardization-plan.md): Complete implementation plan with phases, risk assessment, and success criteria +- Memory Bank updates: progress, activeContext, and decisionLog + +### Technical Decisions + +- **Internal Package Names**: All `@roo-code/*` scope packages +- **External Branding**: Consistent "TNE Code" in user-facing text +- **Implementation Order**: Package.json → UI verification → Internal consistency → Testing + +### Next Steps + +Ready to switch to Code mode for implementation starting with Phase 1 (webview-ui package.json fixes). diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md new file mode 100644 index 0000000000..f38a0bdf78 --- /dev/null +++ b/memory-bank/productContext.md @@ -0,0 +1,37 @@ +# Product Context + +This file provides a high-level overview of the project and the expected product that will be created. Initially it is based upon projectBrief.md (if provided) and all other available project-related information in the working directory. This file is intended to be updated as the project evolves, and should be used to inform all other modes of the project's goals and context. +2025-12-06 06:27:42 - Memory Bank initialized for Roo Code VSCode Extension documentation + +## Project Goal + +**Roo Code** (previously Roo Cline) is an AI-powered autonomous coding agent that lives in VSCode. The goal is to provide developers with a flexible, intelligent assistant that can: + +- Communicate in natural language +- Read and write files directly in workspace +- Run terminal commands +- Automate browser actions +- Integrate with OpenAI-compatible APIs and custom models +- Adapt through Custom Modes for specialized roles + +## Key Features + +- **Multiple Specialized Modes**: Code, Architect, Ask, Debug, Custom Modes +- **Advanced Tool Integration**: File operations, terminal commands, browser automation +- **MCP (Model Context Protocol)**: Extensible tool and resource system +- **Multi-language Support**: Localized for 15+ languages +- **Context Management**: Intelligent context condensing and management +- **Monorepo Architecture**: pnpm workspace with TypeScript, React webview +- **Comprehensive Testing**: Jest (deprecated) transitioning to Vitest + +## Overall Architecture + +- **VSCode Extension Core** (`src/`): TypeScript-based extension host +- **Webview UI** (`webview-ui/`): React-based user interface with Tailwind CSS +- **Shared Packages** (`packages/`): Common types and utilities +- **Documentation** (`docs/`): Comprehensive project documentation +- **Localization** (`locales/`): Multi-language support files +- **Testing Infrastructure**: Comprehensive test suites across all components +- **Development Tools**: ESLint, Prettier, Turborepo for build orchestration + +2025-12-06 06:27:42 - Initial project context documented from README.md and file structure analysis diff --git a/memory-bank/progress.md b/memory-bank/progress.md new file mode 100644 index 0000000000..77c5fbcc7a --- /dev/null +++ b/memory-bank/progress.md @@ -0,0 +1,47 @@ +# Progress + +This file tracks the project's progress using a task list format. +2025-12-06 06:28:25 - Memory Bank initialization continuing + +## Completed Tasks + +- ✅ 2025-12-06 06:28:11 - Memory Bank directory structure created +- ✅ 2025-12-06 06:28:11 - [`productContext.md`](memory-bank/productContext.md) initialized with project overview from [`README.md`](README.md) +- ✅ 2025-12-06 06:28:25 - [`activeContext.md`](memory-bank/activeContext.md) created with current documentation focus + +## Current Tasks + +- 🔄 2025-12-06 06:28:25 - Completing Memory Bank initialization (progress.md, decisionLog.md, systemPatterns.md) +- 🔄 Creating specialized documentation files per TNE0 mode requirements: + - [`memory-bank/tne0-existing-code.md`](memory-bank/tne0-existing-code.md) - Source code analysis + - [`memory-bank/devPrompts.md`](memory-bank/devPrompts.md) - Development prompt tracking + +## Next Steps + +- 📋 Analyze [`src/`](src/) directory structure and TypeScript codebase +- 📋 Examine [`webview-ui/`](webview-ui/) React application architecture +- 📋 Document [`packages/`](packages/) workspace dependencies and shared types +- 📋 Assess monorepo build tooling ([`turbo.json`](turbo.json), [`pnpm-workspace.yaml`](pnpm-workspace.yaml)) +- 📋 Create missing [`Makefile`](Makefile) for streamlined development workflow +- 📋 Document testing strategy transition from Jest to Vitest +- 📋 Map MCP (Model Context Protocol) integration patterns +- 📋 Analyze VSCode extension manifest and activation patterns +- 📋 Create comprehensive architecture diagrams +- 📋 Document UI/UX patterns and component relationships + +## Completed Tasks - 2025-12-06 Session + +- ✅ 2025-12-06 06:35:14 - [`README.md`](README.md) updated with comprehensive development instructions using new Makefile +- ✅ 2025-12-06 06:32:42 - [`Makefile`](Makefile) created and tested - streamlined development workflow automation +- ✅ 2025-12-06 06:32:02 - [`memory-bank/tne0-existing-code.md`](memory-bank/tne0-existing-code.md) completed - comprehensive source code analysis +- ✅ 2025-12-06 06:30:46 - [`memory-bank/devPrompts.md`](memory-bank/devPrompts.md) created - development prompt tracking +- ✅ 2025-12-06 06:30:24 - [`memory-bank/systemPatterns.md`](memory-bank/systemPatterns.md) completed - coding and architectural patterns documented +- ✅ 2025-12-06 06:29:59 - [`memory-bank/decisionLog.md`](memory-bank/decisionLog.md) completed - architectural decisions tracking +- ✅ 2025-12-06 06:28:45 - [`memory-bank/progress.md`](memory-bank/progress.md) completed - task progress tracking +- ✅ 2025-12-06 06:28:25 - [`memory-bank/activeContext.md`](memory-bank/activeContext.md) completed - current status tracking +- ✅ 2025-12-06 06:28:11 - [`memory-bank/productContext.md`](memory-bank/productContext.md) completed - project overview and goals +- ✅ 2025-12-06 06:27:42 - Memory Bank successfully initialized with comprehensive documentation structure + [2025-12-06 06:44:58] - Completed analysis of TNE research mode system. Located tne-product-research mode in src/shared/modes.ts and documented complete 6-phase TNE workflow. Identified role definition inconsistency that needs fixing. + [2025-12-06 06:48:17] - Updated TNE mode names to use number format (TNE1, TNE2, etc.) as requested by user. Modified all 6 TNE mode names in src/shared/modes.ts. + +[2025-12-06 10:56:36] - TNE Code Branding Standardization Plan completed and documented in memory-bank/tne-branding-standardization-plan.md diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md new file mode 100644 index 0000000000..1c1ea46848 --- /dev/null +++ b/memory-bank/systemPatterns.md @@ -0,0 +1,72 @@ +# System Patterns + +This file documents recurring patterns and standards used in the project. +It is optional, but recommended to be updated as the project evolves. +2025-12-06 06:29:59 - Memory Bank initialization finalizing + +## Coding Patterns + +**TypeScript Configuration:** + +- Monorepo structure with shared [`packages/types`](packages/types) for DTOs +- ESLint configuration in [`src/eslint.config.mjs`](src/eslint.config.mjs) +- Jest configuration transitioning to Vitest in [`src/jest.config.mjs`](src/jest.config.mjs) + +**Testing Patterns:** + +- **Legacy:** [`*.test.ts`](src/__tests__/) files using Jest (deprecated) +- **Current:** [`*.spec.ts`](src/__tests__/) files using Vitest (preferred) +- Test organization: [`__tests__`](src/__tests__/) directories within modules +- Mocking strategy: [`__mocks__`](src/services/glob/__mocks__/) for service abstraction + +**File Organization:** + +- Extension core: [`src/`](src/) - TypeScript extension host logic +- User interface: [`webview-ui/`](webview-ui/) - React-based webview components +- Shared utilities: [`packages/`](packages/) - Cross-workspace dependencies +- Documentation: [`docs/`](docs/) - Project documentation and guides + +## Architectural Patterns + +**VSCode Extension Architecture:** + +- **Activation**: Entry point in [`src/activate/index.ts`](src/activate/index.ts) +- **Commands**: Registration in [`src/activate/registerCommands.ts`](src/activate/registerCommands.ts) +- **Code Actions**: Provider in [`src/activate/CodeActionProvider.ts`](src/activate/CodeActionProvider.ts) +- **Services**: Modular services in [`src/services/`](src/services/) directory + +**Monorepo Management:** + +- **Package Manager**: pnpm with [`pnpm-workspace.yaml`](pnpm-workspace.yaml) +- **Build Orchestration**: Turborepo via [`turbo.json`](turbo.json) +- **Workspace Rules**: Primary workspaces (src/, webview-ui/, packages/types) + +**Internationalization:** + +- **Localization**: [`locales/`](locales/) with 15+ language support +- **NLS Files**: [`src/package.nls.*.json`](src/) for extension manifest translations +- **i18n Setup**: [`src/i18n/`](src/i18n/) infrastructure + +## Testing Patterns + +**Current State (Transition Period):** + +- Jest-based tests (`.test.ts`) - Legacy, being phased out +- Vitest-based tests (`.spec.ts`) - Current standard +- Test command: `pnpm test` (runs from root workspace) + +**Testing Strategy:** + +- Unit tests for core services and utilities +- Integration tests for extension activation and command handling +- Webview component testing (React components) +- Service mocking patterns for external dependencies + +**Best Practices:** + +- Use `workspace/directory` for test execution +- Target specific failing tests with substring matching +- Maintain test coverage for all code changes +- Prefer Vitest for new test development + +2025-12-06 06:29:59 - Initial system patterns documented from project structure analysis diff --git a/memory-bank/tne0-existing-code.md b/memory-bank/tne0-existing-code.md new file mode 100644 index 0000000000..ef665cebf1 --- /dev/null +++ b/memory-bank/tne0-existing-code.md @@ -0,0 +1,319 @@ +# TNE Code - Existing Code Analysis + +Comprehensive analysis of the TNE Code VSCode extension codebase. +2025-12-06 06:30:56 - Initial code analysis from project configuration files + +## 1. Source Code Location + +**Primary Location**: [`src/`](src/) directory + +- Main extension source code in TypeScript +- Entry point: [`src/activate/index.ts`](src/activate/index.ts) +- Extension manifest: [`src/package.json`](src/package.json) +- Build output: `src/dist/extension.js` + +## 2. Technology Stack & Tooling + +### Core Technologies + +- **Language**: TypeScript 5.8.3 +- **Runtime**: Node.js 20.19.2 +- **Package Manager**: pnpm 10.8.1 +- **Build Orchestration**: Turborepo 2.5.3 +- **Bundler**: esbuild 0.25.0 +- **Platform**: VSCode Extension API ^1.84.0 + +### Development Tools + +- **Linting**: ESLint 9.27.0 +- **Formatting**: Prettier 3.4.2 +- **Testing**: Jest 29.7.0 (legacy) + Vitest 3.1.3 (current) +- **Type Checking**: TypeScript compiler +- **Git Hooks**: Husky 9.1.7 + lint-staged 16.0.0 + +### AI Provider Integrations + +- **Anthropic**: @anthropic-ai/sdk 0.37.0, Bedrock, Vertex +- **OpenAI**: openai 4.78.1 +- **Google**: @google/genai 1.0.0, google-auth-library 9.15.1 +- **Mistral**: @mistralai/mistralai 1.3.6 +- **AWS**: @aws-sdk/client-bedrock-runtime 3.779.0 + +### Specialized Libraries + +- **MCP**: @modelcontextprotocol/sdk 1.9.0 +- **GraphAI**: Multiple @graphai/\* packages 2.0.x +- **Browser Automation**: puppeteer-core 23.4.0 +- **Code Parsing**: tree-sitter-wasms 0.1.11, web-tree-sitter 0.22.6 +- **Vector Database**: @qdrant/js-client-rest 1.14.0 +- **Document Processing**: pdf-parse, mammoth, turndown, cheerio + +## 3. Monorepo Organization Structure + +### Workspace Configuration ([`pnpm-workspace.yaml`](pnpm-workspace.yaml)) + +```yaml +packages: + - "src" # Main VSCode extension + - "webview-ui" # React-based webview + - "apps/*" # Additional applications + - "packages/*" # Shared packages and utilities +``` + +### Workspace Dependencies + +- **@tne-code/types**: Shared TypeScript types and DTOs +- **@tne-code/cloud**: Cloud service integration +- **@tne-code/ipc**: Inter-process communication +- **@tne-code/telemetry**: Usage analytics +- **@tne-code/build**: Build configurations +- **@tne-code/config-eslint**: Shared ESLint config +- **@tne-code/config-typescript**: Shared TypeScript config + +### Build Pipeline ([`turbo.json`](turbo.json)) + +```json +{ + "tasks": { + "lint": {}, + "check-types": {}, + "test": { "dependsOn": ["@tne-code/types#build"] }, + "format": {}, + "build": { "outputs": ["dist/**"] }, + "clean": { "cache": false } + } +} +``` + +## 4. Program Organization & Structure + +### Extension Architecture + +``` +src/ +├── activate/ # Extension activation logic +│ ├── index.ts # Main activation exports +│ ├── handleUri.ts # URI protocol handling +│ ├── registerCommands.ts # Command registration +│ ├── registerCodeActions.ts # Code action providers +│ ├── registerTerminalActions.ts # Terminal integrations +│ └── CodeActionProvider.ts # VSCode code action implementation +├── services/ # Core business logic services +│ ├── browser/ # Browser automation (Puppeteer) +│ ├── checkpoints/ # State management & checkpoints +│ ├── code-index/ # Code indexing & vector search +│ ├── glob/ # File system operations +│ ├── mcp/ # Model Context Protocol integration +│ ├── ripgrep/ # Fast text search +│ ├── search/ # File search utilities +│ └── tree-sitter/ # Code parsing & analysis +├── shared/ # Shared utilities +├── api/ # External API integrations +├── i18n/ # Internationalization +└── assets/ # Static resources +``` + +### VSCode Extension Manifest ([`src/package.json`](src/package.json)) + +**Extension Identity**: + +- Name: "tne-code" +- Publisher: "tne-ai" +- Display Name: Localized via "%extension.displayName%" +- Version: 0.0.2 +- Repository: https://github.com/tne-ai/TNE-Code + +**Key Features**: + +- **Activity Bar Integration**: Custom activity bar with webview panel +- **Command Palette**: 15+ commands for AI assistance and code actions +- **Context Menus**: Editor and terminal right-click integrations +- **Code Actions**: Explain, fix, improve code functionality +- **Terminal Actions**: Command explanation and debugging +- **Settings**: Configurable AI model selection and storage paths + +**View Contributions**: + +- Activity Bar Container: "tne-code-ActivityBar" +- Webview Panel: "tne-code.SidebarProvider" +- Tab Panel: "tne-code.TabPanelProvider" + +## 5. Database Schema & Relationships + +### Vector Database (Qdrant Integration) + +- **Purpose**: Code indexing and semantic search +- **Client**: @qdrant/js-client-rest 1.14.0 +- **Location**: [`src/services/code-index/vector-store/`](src/services/code-index/vector-store/) +- **Schema**: Code embeddings with metadata for semantic code search + +### Local Storage + +- **VSCode Settings**: Extension configuration via VSCode settings API +- **Task History**: Local storage for conversation history +- **Checkpoints**: State snapshots for task resumption +- **MCP Settings**: Model Context Protocol server configurations + +### File System Database + +- **Config Files**: JSON-based configuration storage +- **Cache**: Temporary data and build artifacts +- **Global Storage**: VSCode global storage for cross-workspace data + +## 6. User Interface Documentation + +### Webview Architecture + +- **Framework**: React (in [`webview-ui/`](webview-ui/) workspace) +- **Styling**: Tailwind CSS with VSCode theme integration +- **Communication**: VSCode webview message passing API + +### Main UI Components + +1. **Activity Bar Icon**: Entry point to extension +2. **Sidebar Panel**: Primary chat interface with AI assistant +3. **Tab Panel**: Dedicated editor tab for extended conversations +4. **Context Menus**: Quick actions in editor and terminal +5. **Command Palette**: All extension commands accessible via Ctrl/Cmd+Shift+P + +### Button Actions (Toolbar) + +- **Plus (+)**: Create new task/conversation +- **Server**: MCP server management +- **Organization**: Prompts and templates +- **History**: Previous conversations +- **External Link**: Open in new tab +- **Account**: TNE Code Cloud features (when enabled) +- **Settings**: Extension configuration + +### Command Categories + +- **Code Actions**: explainCode, fixCode, improveCode, addToContext +- **Terminal Actions**: addToContext, fixCommand, explainCommand +- **Navigation**: newTask, openInNewTab, focusInput, acceptInput +- **Management**: setCustomStoragePath, settings management + +## 7. Identified Shortfalls & Missing Components + +### Missing Development Infrastructure + +- ❌ **No Makefile**: Missing streamlined development workflow automation +- ❌ **No .env Template**: Environment variables not documented +- ❌ **Limited Documentation**: API documentation and architecture guides needed + +### Testing Gaps + +- ⚠️ **Test Migration**: Jest to Vitest transition incomplete +- ⚠️ **Coverage Reporting**: Test coverage metrics not clearly defined +- ⚠️ **Integration Tests**: Browser automation and MCP integration testing + +### Build & DevOps + +- ⚠️ **Local Development**: No simple `make run` for development +- ⚠️ **Environment Setup**: Complex bootstrap process in scripts/ +- ⚠️ **Database Setup**: Qdrant vector database setup not automated + +### Security & Privacy + +- ⚠️ **API Key Management**: No standardized secret management +- ⚠️ **MCP Security**: External server integration security model +- ⚠️ **Cloud Integration**: Optional cloud features need privacy review + +## 8. Module Interrelationships + +### Core Dependencies Flow + +``` +Extension Host (src/) +├── Webview UI (webview-ui/) +├── Shared Types (@tne-code/types) +├── Cloud Services (@tne-code/cloud) +├── Telemetry (@tne-code/telemetry) +└── Build Config (@tne-code/build) +``` + +### Service Architecture + +``` +Extension Activation +├── Command Registration → VSCode API +├── Code Actions → Tree-sitter + AI Providers +├── MCP Integration → External Servers +├── Browser Service → Puppeteer automation +├── Code Index → Qdrant + Embeddings +└── File Operations → Ripgrep + Glob +``` + +### AI Provider Integration + +``` +AI Request Flow: +User Input → Extension → Provider SDK → External API + ↓ + MCP Server Integration (optional) + ↓ + Response Processing → Webview UI +``` + +2025-12-06 06:30:56 - Comprehensive existing code analysis completed based on project configuration and structure + +# TNE Code Extension - Existing Code Analysis + +[2025-12-06 06:44:29] - Initial analysis of TNE research mode system and mode configuration + +## TNE Research Mode System Analysis + +### Location + +- **Primary Configuration**: [`src/shared/modes.ts`](src/shared/modes.ts:2330-2393) +- **Lines**: 2330-2393 (TNE mode definitions) + +### TNE Workflow Architecture + +The TNE system implements a comprehensive 6-phase project planning workflow: + +1. **[`tne-product-research`](src/shared/modes.ts:2331)** - 🔍 1. TNE - Product Research +2. **[`tne-report-reco`](src/shared/modes.ts:2341)** - 📊 2. TNE - Technical Reports +3. **[`tne-business-decisions`](src/shared/modes.ts:2352)** - 💼 3. TNE - Business Memos +4. **[`tne-project-brief`](src/shared/modes.ts:2363)** - 🏗️ 4. TNE - Project Brief +5. **[`tne-skeptic`](src/shared/modes.ts:2374)** - 🤔 5. TNE - Skeptic +6. **[`tne-customer-presentation`](src/shared/modes.ts:2384)** - ✨ 6. TNE - Customer Presentations + +### TNE Product Research Mode Details + +**Configuration**: + +- **Slug**: `tne-product-research` +- **Name**: "🔍 1. TNE - Product Research" +- **Groups**: `["read", "edit", "browser", "command", "mcp"]` (Full tool access) +- **Role Definition**: `"You are an expert in the listed TOPIC or APPLICATION."` ⚠️ **INCONSISTENCY FOUND** +- **Memory Bank Integration**: Saves to `memory_bank/tne-product-research.md` + +**Process Steps**: 0. Explain APPLICATION/TOPIC +0.5. Determine business requirements + +1. Best AI techniques research +2. Open source models analysis (including multimodal LLMs) + 2a. GitHub model discovery +3. Proprietary/cloud systems evaluation +4. ArXiv research paper analysis +5. Ensemble technique design +6. Standard datasets and metrics identification + 6a. Competitive product analysis +7. URL validation and citation checking + +### Mode System Inconsistency + +**Issue Found**: The [`tne-product-research`](src/shared/modes.ts:2333) mode has inconsistent role definition: + +**Current**: `"You are an expert in the listed TOPIC or APPLICATION."` +**Should be**: `"You are TNE-Code, an expert in the listed TOPIC or APPLICATION."` + +All other TNE modes correctly use "TNE-Code" format, but this one is missing the branding consistency. + +### Workflow Integration + +- Each mode references the complete workflow in `whenToUse` field +- Sequential progression: `tne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation` +- Memory bank integration throughout workflow +- Each phase reads from previous phases' memory bank files diff --git a/package.json b/package.json index 2aca3681b0..3d42fd8874 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "roo-code", + "name": "tne-code", "packageManager": "pnpm@10.8.1", "engines": { "node": "20.19.2" diff --git a/packages/build/eslint.config.mjs b/packages/build/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/build/eslint.config.mjs +++ b/packages/build/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/build/package.json b/packages/build/package.json index b6897732db..7c8bd8eee2 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { - "name": "@roo-code/build", - "description": "ESBuild utilities for Roo Code.", + "name": "@tne-code/build", + "description": "ESBuild utilities for TNE-Code.", "private": true, "type": "module", "main": "./dist/index.js", @@ -16,8 +16,8 @@ "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "vitest": "^3.1.3" } diff --git a/packages/build/tsconfig.json b/packages/build/tsconfig.json index a66434e570..6ce85356d7 100644 --- a/packages/build/tsconfig.json +++ b/packages/build/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/base.json", + "extends": "@tne-code/config-typescript/base.json", "compilerOptions": { "types": ["vitest/globals"], "outDir": "dist" diff --git a/packages/cloud/eslint.config.mjs b/packages/cloud/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/cloud/eslint.config.mjs +++ b/packages/cloud/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/cloud/package.json b/packages/cloud/package.json index 375838dc95..f3bbeff61c 100644 --- a/packages/cloud/package.json +++ b/packages/cloud/package.json @@ -1,6 +1,6 @@ { - "name": "@roo-code/cloud", - "description": "Roo Code Cloud VSCode integration.", + "name": "@tne-code/cloud", + "description": "TNE-Code Cloud VSCode integration.", "version": "0.0.0", "type": "module", "exports": "./src/index.ts", @@ -11,14 +11,14 @@ "clean": "rimraf dist .turbo" }, "dependencies": { - "@roo-code/telemetry": "workspace:^", - "@roo-code/types": "workspace:^", + "@tne-code/telemetry": "workspace:^", + "@tne-code/types": "workspace:^", "axios": "^1.7.4", "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "@types/vscode": "^1.84.0", "vitest": "^3.1.3" diff --git a/packages/cloud/tsconfig.json b/packages/cloud/tsconfig.json index f599e2220d..c22919787b 100644 --- a/packages/cloud/tsconfig.json +++ b/packages/cloud/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/vscode-library.json", + "extends": "@tne-code/config-typescript/vscode-library.json", "include": ["src"], "exclude": ["node_modules"] } diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json index 9305698034..ff721a9bba 100644 --- a/packages/config-eslint/package.json +++ b/packages/config-eslint/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/config-eslint", + "name": "@tne-code/config-eslint", "private": true, "type": "module", "exports": { diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json index 0fa45e15d4..a4dedd4c29 100644 --- a/packages/config-typescript/package.json +++ b/packages/config-typescript/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/config-typescript", + "name": "@tne-code/config-typescript", "private": true, "publishConfig": { "access": "public" diff --git a/packages/evals/eslint.config.mjs b/packages/evals/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/evals/eslint.config.mjs +++ b/packages/evals/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/evals/package.json b/packages/evals/package.json index 88195b134b..f8d7017642 100644 --- a/packages/evals/package.json +++ b/packages/evals/package.json @@ -1,6 +1,6 @@ { - "name": "@roo-code/evals", - "description": "Roo Code evals.", + "name": "@tne-code/evals", + "description": "TNE-Code evals.", "version": "0.0.0", "type": "module", "exports": "./src/index.ts", @@ -25,8 +25,8 @@ "services:start": "docker compose up -d db redis" }, "dependencies": { - "@roo-code/ipc": "workspace:^", - "@roo-code/types": "workspace:^", + "@tne-code/ipc": "workspace:^", + "@tne-code/types": "workspace:^", "better-sqlite3": "^11.10.0", "cmd-ts": "^0.13.0", "drizzle-orm": "^0.44.1", @@ -41,8 +41,8 @@ "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "@types/node-ipc": "^9.2.3", "@types/ps-tree": "^1.1.6", diff --git a/packages/evals/tsconfig.json b/packages/evals/tsconfig.json index 811519a302..82d6176ad3 100644 --- a/packages/evals/tsconfig.json +++ b/packages/evals/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/base.json", + "extends": "@tne-code/config-typescript/base.json", "compilerOptions": { "types": ["vitest/globals"] }, diff --git a/packages/ipc/eslint.config.mjs b/packages/ipc/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/ipc/eslint.config.mjs +++ b/packages/ipc/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/ipc/package.json b/packages/ipc/package.json index 6c8b9dba33..88fa0c1af4 100644 --- a/packages/ipc/package.json +++ b/packages/ipc/package.json @@ -1,6 +1,6 @@ { - "name": "@roo-code/ipc", - "description": "IPC server and client for remote Roo Code access.", + "name": "@tne-code/ipc", + "description": "IPC server and client for remote TNE-Code access.", "version": "0.0.0", "type": "module", "exports": "./src/index.ts", @@ -10,12 +10,12 @@ "clean": "rimraf .turbo" }, "dependencies": { - "@roo-code/types": "workspace:^", + "@tne-code/types": "workspace:^", "node-ipc": "^12.0.0" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "@types/node-ipc": "^9.2.3", "vitest": "^3.1.3" diff --git a/packages/ipc/tsconfig.json b/packages/ipc/tsconfig.json index 0f9961fdbd..9604e25be6 100644 --- a/packages/ipc/tsconfig.json +++ b/packages/ipc/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/base.json", + "extends": "@tne-code/config-typescript/base.json", "compilerOptions": { "types": ["vitest/globals"] }, diff --git a/packages/telemetry/eslint.config.mjs b/packages/telemetry/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/telemetry/eslint.config.mjs +++ b/packages/telemetry/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index f9e228bc89..9ecc198131 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -1,6 +1,6 @@ { - "name": "@roo-code/telemetry", - "description": "Roo Code telemetry service and clients.", + "name": "@tne-code/telemetry", + "description": "TNE-Code telemetry service and clients.", "version": "0.0.0", "type": "module", "exports": "./src/index.ts", @@ -11,13 +11,13 @@ "clean": "rimraf dist .turbo" }, "dependencies": { - "@roo-code/types": "workspace:^", + "@tne-code/types": "workspace:^", "posthog-node": "^4.7.0", "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "@types/vscode": "^1.84.0", "vitest": "^3.1.3" diff --git a/packages/telemetry/tsconfig.json b/packages/telemetry/tsconfig.json index f599e2220d..c22919787b 100644 --- a/packages/telemetry/tsconfig.json +++ b/packages/telemetry/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/vscode-library.json", + "extends": "@tne-code/config-typescript/vscode-library.json", "include": ["src"], "exclude": ["node_modules"] } diff --git a/packages/tne-tne-agent-v2-0.0.1.j.tgz b/packages/tne-tne-agent-v2-0.0.1.j.tgz new file mode 100644 index 0000000000..f76ea550fd Binary files /dev/null and b/packages/tne-tne-agent-v2-0.0.1.j.tgz differ diff --git a/packages/types/eslint.config.mjs b/packages/types/eslint.config.mjs index 694bf73664..8465453cdf 100644 --- a/packages/types/eslint.config.mjs +++ b/packages/types/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [...config] diff --git a/packages/types/npm/package.json b/packages/types/npm/package.json index 37549f9e59..1c1dd0bc31 100644 --- a/packages/types/npm/package.json +++ b/packages/types/npm/package.json @@ -1,24 +1,24 @@ { - "name": "@roo-code/types", + "name": "@tne-code/types", "version": "1.25.0", - "description": "TypeScript type definitions for Roo Code.", + "description": "TypeScript type definitions for TNE-Code.", "publishConfig": { "access": "public", - "name": "@roo-code/types" + "name": "@tne-code/types" }, - "author": "Roo Code Team", + "author": "TNE-Code Team", "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/RooCodeInc/Roo-Code.git" + "url": "git+https://github.com/tne-ai/TNE-Code.git" }, "bugs": { - "url": "https://github.com/RooCodeInc/Roo-Code/issues" + "url": "https://github.com/tne-ai/TNE-Code/issues" }, - "homepage": "https://github.com/RooCodeInc/Roo-Code/tree/main/packages/types", + "homepage": "https://github.com/tne-ai/TNE-Code/tree/main/packages/types", "keywords": [ - "roo", - "roo-code", + "tne", + "tne-code", "ai" ], "main": "./dist/index.cjs", diff --git a/packages/types/package.json b/packages/types/package.json index d35b9501df..923ed6b871 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,5 +1,5 @@ { - "name": "@roo-code/types", + "name": "@tne-code/types", "version": "0.0.0", "type": "module", "main": "./dist/index.cjs", @@ -26,8 +26,8 @@ "zod": "^3.24.2" }, "devDependencies": { - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/node": "^22.15.20", "tsup": "^8.3.5", "vitest": "^3.1.3" diff --git a/packages/types/src/tool.ts b/packages/types/src/tool.ts index 9e807d639d..663817bc71 100644 --- a/packages/types/src/tool.ts +++ b/packages/types/src/tool.ts @@ -33,6 +33,7 @@ export const toolNames = [ "new_task", "fetch_instructions", "codebase_search", + "run_graphai", ] as const export const toolNamesSchema = z.enum(toolNames) diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index a66434e570..6ce85356d7 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@roo-code/config-typescript/base.json", + "extends": "@tne-code/config-typescript/base.json", "compilerOptions": { "types": ["vitest/globals"], "outDir": "dist" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44186f1264..6804efa8cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,13 +22,13 @@ importers: version: 0.25.5 eslint: specifier: ^9.27.0 - version: 9.28.0(jiti@2.4.2) + version: 9.27.0(jiti@2.4.2) husky: specifier: ^9.1.7 version: 9.1.7 knip: specifier: ^5.44.4 - version: 5.60.0(@types/node@22.15.29)(typescript@5.8.3) + version: 5.55.1(@types/node@22.15.29)(typescript@5.8.3) lint-staged: specifier: ^16.0.0 version: 16.1.0 @@ -56,13 +56,13 @@ importers: apps/vscode-e2e: devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../../packages/config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../../packages/config-typescript - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../../packages/types '@types/mocha': @@ -95,7 +95,7 @@ importers: apps/vscode-nightly: devDependencies: - '@roo-code/build': + '@tne-code/build': specifier: workspace:^ version: link:../../packages/build @@ -140,15 +140,15 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@roo-code/evals': + '@tanstack/react-query': + specifier: ^5.69.0 + version: 5.76.1(react@18.3.1) + '@tne-code/evals': specifier: workspace:^ version: link:../../packages/evals - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../../packages/types - '@tanstack/react-query': - specifier: ^5.69.0 - version: 5.76.1(react@18.3.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -187,7 +187,7 @@ importers: version: 17.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redis: specifier: ^5.5.5 - version: 5.5.5 + version: 5.5.6 sonner: specifier: ^2.0.5 version: 2.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -204,15 +204,15 @@ importers: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.8 + '@tne-code/config-eslint': specifier: workspace:^ version: link:../../packages/config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../../packages/config-typescript - '@tailwindcss/postcss': - specifier: ^4 - version: 4.1.8 '@types/ps-tree': specifier: ^1.1.6 version: 1.1.6 @@ -227,7 +227,7 @@ importers: version: 4.1.6 vitest: specifier: ^3.2.1 - version: 3.2.1(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.2(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) apps/web-roo-code: dependencies: @@ -240,12 +240,12 @@ importers: '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@18.3.23)(react@18.3.1) - '@roo-code/types': - specifier: workspace:^ - version: link:../../packages/types '@tanstack/react-query': specifier: ^5.79.0 - version: 5.80.2(react@18.3.1) + version: 5.80.6(react@18.3.1) + '@tne-code/types': + specifier: workspace:^ + version: link:../../packages/types class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -254,10 +254,10 @@ importers: version: 2.1.1 drizzle-orm: specifier: ^0.44.0 - version: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7) + version: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7) drizzle-zod: specifier: ^0.8.0 - version: 0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7))(zod@3.25.49) + version: 0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7))(zod@3.25.56) embla-carousel-auto-scroll: specifier: ^8.6.0 version: 8.6.0(embla-carousel@8.6.0) @@ -281,7 +281,7 @@ importers: version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) posthog-js: specifier: ^1.248.1 - version: 1.249.2 + version: 1.249.4 react: specifier: ^18.3.1 version: 18.3.1 @@ -302,20 +302,20 @@ importers: version: 1.0.7(tailwindcss@3.4.17) zod: specifier: ^3.25.41 - version: 3.25.49 + version: 3.25.56 devDependencies: - '@roo-code/config-eslint': + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@3.4.17) + '@tne-code/config-eslint': specifier: workspace:^ version: link:../../packages/config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../../packages/config-typescript - '@tailwindcss/typography': - specifier: ^0.5.16 - version: 0.5.16(tailwindcss@3.4.17) '@types/node': specifier: ^20.17.54 - version: 20.17.57 + version: 20.19.0 '@types/react': specifier: ^18.3.23 version: 18.3.23 @@ -341,10 +341,10 @@ importers: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -356,10 +356,10 @@ importers: packages/cloud: dependencies: - '@roo-code/telemetry': + '@tne-code/telemetry': specifier: workspace:^ version: link:../telemetry - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../types axios: @@ -369,10 +369,10 @@ importers: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -422,10 +422,10 @@ importers: packages/evals: dependencies: - '@roo-code/ipc': + '@tne-code/ipc': specifier: workspace:^ version: link:../ipc - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../types better-sqlite3: @@ -436,7 +436,7 @@ importers: version: 0.13.0 drizzle-orm: specifier: ^0.44.1 - version: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7) + version: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7) execa: specifier: ^9.6.0 version: 9.6.0 @@ -460,15 +460,15 @@ importers: version: 1.2.0 redis: specifier: ^5.5.5 - version: 5.5.5 + version: 5.5.6 zod: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -492,17 +492,17 @@ importers: packages/ipc: dependencies: - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../types node-ipc: specifier: ^12.0.0 version: 12.0.0 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -517,7 +517,7 @@ importers: packages/telemetry: dependencies: - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../types posthog-node: @@ -527,10 +527,10 @@ importers: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -549,10 +549,10 @@ importers: specifier: ^3.24.2 version: 3.24.4 devDependencies: - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../config-typescript '@types/node': @@ -584,7 +584,16 @@ importers: version: 3.817.0 '@google/genai': specifier: ^1.0.0 - version: 1.3.0(@modelcontextprotocol/sdk@1.12.0) + version: 1.4.0(@modelcontextprotocol/sdk@1.12.0) + '@graphai/agent_filters': + specifier: ^2.0.0 + version: 2.0.0(@types/node@20.17.50) + '@graphai/llm_agents': + specifier: ^2.0.1 + version: 2.0.1(ws@8.18.2)(zod@3.24.4) + '@graphai/vanilla': + specifier: ^2.0.4 + version: 2.0.4 '@mistralai/mistralai': specifier: ^1.3.6 version: 1.6.1(zod@3.24.4) @@ -594,18 +603,21 @@ importers: '@qdrant/js-client-rest': specifier: ^1.14.0 version: 1.14.0(typescript@5.8.3) - '@roo-code/cloud': + '@tne-code/cloud': specifier: workspace:^ version: link:../packages/cloud - '@roo-code/ipc': + '@tne-code/ipc': specifier: workspace:^ version: link:../packages/ipc - '@roo-code/telemetry': + '@tne-code/telemetry': specifier: workspace:^ version: link:../packages/telemetry - '@roo-code/types': + '@tne-code/types': specifier: workspace:^ version: link:../packages/types + '@tne/tne-agent-v2': + specifier: file:../packages/tne-tne-agent-v2-0.0.1.j.tgz + version: file:packages/tne-tne-agent-v2-0.0.1.j.tgz(@types/node@20.17.50)(ws@8.18.2)(zod@3.24.4) '@types/lodash.debounce': specifier: ^4.0.9 version: 4.0.9 @@ -644,7 +656,7 @@ importers: version: 3.1.3 fast-xml-parser: specifier: ^5.0.0 - version: 5.2.3 + version: 5.2.5 fastest-levenshtein: specifier: ^1.0.16 version: 1.0.16 @@ -657,6 +669,9 @@ importers: google-auth-library: specifier: ^9.15.1 version: 9.15.1 + graphai: + specifier: ^2.0.5 + version: 2.0.5 i18next: specifier: ^25.0.0 version: 25.2.1(typescript@5.8.3) @@ -772,13 +787,13 @@ importers: '@jest/globals': specifier: ^29.7.0 version: 29.7.0 - '@roo-code/build': + '@tne-code/build': specifier: workspace:^ version: link:../packages/build - '@roo-code/config-eslint': + '@tne-code/config-eslint': specifier: workspace:^ version: link:../packages/config-eslint - '@roo-code/config-typescript': + '@tne-code/config-typescript': specifier: workspace:^ version: link:../packages/config-typescript '@types/clone-deep': @@ -925,15 +940,15 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@roo-code/types': - specifier: workspace:^ - version: link:../packages/types '@tailwindcss/vite': specifier: ^4.0.0 version: 4.1.6(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@tanstack/react-query': specifier: ^5.68.0 version: 5.76.1(react@18.3.1) + '@tne-code/types': + specifier: workspace:^ + version: link:../packages/types '@vscode/codicons': specifier: ^0.0.36 version: 0.0.36 @@ -1061,24 +1076,18 @@ importers: '@jest/globals': specifier: ^29.7.0 version: 29.7.0 - '@roo-code/config-eslint': - specifier: workspace:^ - version: link:../packages/config-eslint - '@roo-code/config-typescript': - specifier: workspace:^ - version: link:../packages/config-typescript '@storybook/addon-essentials': specifier: ^8.5.6 - version: 8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.12(@types/react@18.3.23)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) '@storybook/blocks': specifier: ^8.5.6 - version: 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) '@storybook/react': specifier: ^9.0.0 - version: 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + version: 9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: ^9.0.0 - version: 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -1088,6 +1097,12 @@ importers: '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) + '@tne-code/config-eslint': + specifier: workspace:^ + version: link:../packages/config-eslint + '@tne-code/config-typescript': + specifier: workspace:^ + version: link:../packages/config-typescript '@types/jest': specifier: ^29.0.0 version: 29.5.14 @@ -1126,10 +1141,10 @@ importers: version: 1.0.5 storybook: specifier: ^9.0.0 - version: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + version: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) storybook-dark-mode: specifier: ^4.0.2 - version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) ts-jest: specifier: ^29.2.5 version: 29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0))(typescript@5.8.3) @@ -1162,9 +1177,16 @@ packages: '@anthropic-ai/bedrock-sdk@0.10.4': resolution: {integrity: sha512-szduEHbMli6XL934xrraYg5cFuKL/1oMyj/iZuEVjtddQ7eD5cXObzWobsv5mTLWijQmSzMfFD+JAUHDPHlQ/Q==} + '@anthropic-ai/sdk@0.36.3': + resolution: {integrity: sha512-+c0mMLxL/17yFZ4P5+U6bTWiCSFZUKJddrv01ud2aFBWnTPLdRncYV76D3q1tqfnL7aCnhRtykFnoCFzvr4U3Q==} + '@anthropic-ai/sdk@0.37.0': resolution: {integrity: sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw==} + '@anthropic-ai/sdk@0.52.0': + resolution: {integrity: sha512-d4c+fg+xy9e46c8+YnrrgIQR45CZlAi7PwdzIfDXDM6ACxEZli1/fxhURsq30ZpMZy6LvSkr41jGq5aF5TD7rQ==} + hasBin: true + '@anthropic-ai/vertex-sdk@0.7.0': resolution: {integrity: sha512-zNm3hUXgYmYDTyveIxOyxbcnh5VXFkrLo4bSnG6LAfGzW7k3k2iCNDSVKtR9qZrK2BCid7JtVu7jsEKaZ/9dSw==} @@ -1175,6 +1197,12 @@ packages: resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -1205,14 +1233,26 @@ packages: resolution: {integrity: sha512-MNGwOJDQU0jpvsLLPSuPQDhPtDzFTc/k7rLmiKoPrIlgb3Y8pSF4crpJ+ZH3+xod2NWyyOVMEMQeMaKFFdMaKw==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.823.0': + resolution: {integrity: sha512-cTp1Lkyv5NuHr6aUin5FCARY02o2jiOcRKnWnAahEQrlvgzOAe4SrjjOVVTH67wHdcB9zGeNDNCK/132+zaRow==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.817.0': resolution: {integrity: sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.823.0': + resolution: {integrity: sha512-dBWdsbyGw8rPfdCsZySNtTOGQK4EZ8lxB/CneSQWRBPHgQ+Ys88NXxImO8xfWO7Itt1eh8O7UDTZ9+smcvw2pw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.816.0': resolution: {integrity: sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==} engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.823.0': + resolution: {integrity: sha512-1Cf4w8J7wYexz0KU3zpaikHvldGXQEjFldHOhm0SBGRy7qfYNXecfJAamccF7RdgLxKGgkv5Pl9zX/Z/DcW9zg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.817.0': resolution: {integrity: sha512-+dzgWGmdmMNDdeSF+VvONN+hwqoGKX5A6Z3+siMO4CIoKWN7u5nDOx/JLjTGdVQji3522pJjJ+o9veQJNWOMRg==} engines: {node: '>=18.0.0'} @@ -1221,30 +1261,58 @@ packages: resolution: {integrity: sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.823.0': + resolution: {integrity: sha512-AIrLLwumObge+U1klN4j5ToIozI+gE9NosENRyHe0GIIZgTLOG/8jxrMFVYFeNHs7RUtjDTxxewislhFyGxJ/w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.816.0': resolution: {integrity: sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.823.0': + resolution: {integrity: sha512-u4DXvB/J/o2bcvP1JP6n3ch7V3/NngmiJFPsM0hKUyRlLuWM37HEDEdjPRs3/uL/soTxrEhWKTA9//YVkvzI0w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.817.0': resolution: {integrity: sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.823.0': + resolution: {integrity: sha512-C0o63qviK5yFvjH9zKWAnCUBkssJoQ1A1XAHe0IAQkurzoNBSmu9oVemqwnKKHA4H6QrmusaEERfL00yohIkJA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.817.0': resolution: {integrity: sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.823.0': + resolution: {integrity: sha512-nfSxXVuZ+2GJDpVFlflNfh55Yb4BtDsXLGNssXF5YU6UgSPsi8j2YkaE92Jv2s7dlUK07l0vRpLyPuXMaGeiRQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.816.0': resolution: {integrity: sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.823.0': + resolution: {integrity: sha512-U/A10/7zu2FbMFFVpIw95y0TZf+oYyrhZTBn9eL8zgWcrYRqxrxdqtPj/zMrfIfyIvQUhuJSENN4dx4tfpCMWQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.817.0': resolution: {integrity: sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.823.0': + resolution: {integrity: sha512-ff8IM80Wqz1V7VVMaMUqO2iR417jggfGWLPl8j2l7uCgwpEyop1ZZl5CFVYEwSupRBtwp+VlW1gTCk7ke56MUw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.817.0': resolution: {integrity: sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.823.0': + resolution: {integrity: sha512-lzoZdJMQq9w7i4lXVka30cVBe/dZoUDZST8Xz/soEd73gg7RTKgG+0szL4xFWgdBDgcJDWLfZfJzlbyIVyAyOA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-providers@3.817.0': resolution: {integrity: sha512-i6Q2MyktWHG4YG+EmLlnXTgNVjW9/yeNHSKzF55GTho5fjqfU+t9beJfuMWclanRCifamm3N5e5OCm52rVDdTQ==} engines: {node: '>=18.0.0'} @@ -1253,46 +1321,114 @@ packages: resolution: {integrity: sha512-LZddQVBUCB86tZtLJRhqiDyIqr4hfRxZCcUp1fZSfpBMcf419lgcFRGWMR3J/kCWHQ0G05aor7fSeoeaxskuNQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.821.0': + resolution: {integrity: sha512-cebgeytKlWOgGczLo3BPvNY9XlzAzGZQANSysgJ2/8PSldmUpXRIF+GKPXDVhXeInWYHIfB8zZi3RqrPoXcNYQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-eventstream@3.804.0': resolution: {integrity: sha512-3lPxZshOJoKSxIMUq8FCiIre+FZ1g/t+O7DHwOMB6EuzJ8lp5QyUeh1wE5iD/gB8VhWZoj90rGIaWCmT8ccEuA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.821.0': + resolution: {integrity: sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.823.0': + resolution: {integrity: sha512-Elt6G1ryEEdkrppqbyJON0o2x4x9xKknimJtMLdfG1b4YfO9X+UB31pk4R2SHvMYfrJ+p8DE2jRAhvV4g/dwIQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.804.0': resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.821.0': + resolution: {integrity: sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.821.0': + resolution: {integrity: sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.804.0': resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.821.0': + resolution: {integrity: sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.804.0': resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.821.0': + resolution: {integrity: sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.823.0': + resolution: {integrity: sha512-UV755wt2HDru8PbxLn2S0Fvwgdn9mYamexn31Q6wyUGQ6rkpjKNEzL+oNDGQQmDQAOcQO+nLubKFsCwtBM02fQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.821.0': + resolution: {integrity: sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.816.0': resolution: {integrity: sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.823.0': + resolution: {integrity: sha512-TKRQK09ld1LrIPExC9rIDpqnMsWcv+eq8ABKFHVo8mDLTSuWx/IiQ4eCh9T5zDuEZcLY4nNYCSzXKqw6XKcMCA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.817.0': resolution: {integrity: sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.823.0': + resolution: {integrity: sha512-/BcyOBubrJnd2gxlbbmNJR1w0Z3OVN/UE8Yz20e+ou+Mijjv7EbtVwmWvio1e3ZjphwdA8tVfPYZKwXmrvHKmQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.808.0': resolution: {integrity: sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==} engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.821.0': + resolution: {integrity: sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.823.0': + resolution: {integrity: sha512-FAvtmR7G0ppNLa4O2yN8koFYUmUmPuL60UBIFrVb3BBeZvBIFLln69lB8EGtTBpAvVbxknudRZCzYtnOhE4QXg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.817.0': resolution: {integrity: sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.823.0': + resolution: {integrity: sha512-vz6onCb/+g4y+owxGGPMEMdN789dTfBOgz/c9pFv0f01840w9Rrt46l+gjQlnXnx+0KG6wNeBIVhFdbCfV3HyQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.804.0': resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.821.0': + resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.804.0': + resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.808.0': resolution: {integrity: sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.821.0': + resolution: {integrity: sha512-Uknt/zUZnLE76zaAAPEayOeF5/4IZ2puTFXvcSCWHsi9m3tqbb9UozlnlVqvCZLCRWfQryZQoG2W4XSS3qgk5A==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-locate-window@3.804.0': resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} engines: {node: '>=18.0.0'} @@ -1300,6 +1436,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.804.0': resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} + '@aws-sdk/util-user-agent-browser@3.821.0': + resolution: {integrity: sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==} + '@aws-sdk/util-user-agent-node@3.816.0': resolution: {integrity: sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==} engines: {node: '>=18.0.0'} @@ -1309,9 +1448,22 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.823.0': + resolution: {integrity: sha512-WvNeRz7HV3JLBVGTXW4Qr5QvvWY0vtggH5jW/NqHFH+ZEliVQaUIJ/HNLMpMoCSiu/DlpQAyAjRZXAptJ0oqbw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + '@aws-sdk/xml-builder@3.821.0': + resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} + engines: {node: '>=18.0.0'} + '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} @@ -1522,10 +1674,6 @@ packages: resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -2115,10 +2263,6 @@ packages: resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.28.0': - resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2146,12 +2290,113 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@google/genai@1.3.0': - resolution: {integrity: sha512-rrMzAELX4P902FUpuWy/W3NcQ7L3q/qtCzfCmGVqIce8yWpptTF9hkKsw744tvZpwqhuzD0URibcJA95wd8QFA==} + '@google/genai@1.4.0': + resolution: {integrity: sha512-u9LQZbWBhqaaLelCcYsxMNDTeW12jzNwGkI/eqUeMG/iB1gJBu56LCxrFJ/hkHeZQgPg+j1pckBLZS/dnOh+Bw==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.11.0 + '@google/generative-ai@0.21.0': + resolution: {integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==} + engines: {node: '>=18.0.0'} + + '@google/generative-ai@0.24.1': + resolution: {integrity: sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==} + engines: {node: '>=18.0.0'} + + '@graphai/agent_filter_utils@2.0.0': + resolution: {integrity: sha512-ChqtwP3DYGdJtmmtz/uojEayVoKXypYwbGefPzuQS90sGbvcFQCfq46yiaUSj5CTQehaqjkwHxw69897bSg9xw==} + + '@graphai/agent_filters@2.0.0': + resolution: {integrity: sha512-nE2g9EvbJZLWOG0CR6OlJmYmYCMMdjmbKn7oRTMEXYnlDNxUKlBZcNPfOQP7uBDxuEhXLqskPPIthucC+PZTRw==} + + '@graphai/agent_utils@0.0.3': + resolution: {integrity: sha512-dybbO54rI9E1XfNaHhxLT9xES7G9KC2mXyDYaKvvcDF3bSF6/870CzQb3AOxqzy6WadkKPO+oFye85RM8uNaHg==} + + '@graphai/agent_utils@2.0.1': + resolution: {integrity: sha512-7hIGPFmF3mq9ZBU/X4wLY0W2ctp5+wKaHQnfwNIrWeTQ8ZHvfPggArt/prX0pPXFgsYZFixVuInAW+sW1G6AXA==} + + '@graphai/agents@0.2.10': + resolution: {integrity: sha512-m6H7NKkqbuMVA8baZVH7bpYsRT33UiYCIOKdubTF6IBOfWLZoCieJt58e5pEWT1THSiWGMdhgAxjARjG9o0LHg==} + + '@graphai/anthropic_agent@0.2.3': + resolution: {integrity: sha512-B0+RqMaKsn0gaRb9uMhYoYxnLwVtz8/Thk7ZmbAjqlX/9QQUljXM+0En/o7MsaU+88cHa1gx7b/jE4unMbWlgA==} + + '@graphai/anthropic_agent@2.0.2': + resolution: {integrity: sha512-3axa6R1payLfdCaNZwi91TvliVSh6e4e/sLu/b6MvtNgjjFdxSBeA4n/xcwZd3IwIFfYOxjlq1OPdojQ8DzKkg==} + + '@graphai/cache_agent_filter@2.0.2': + resolution: {integrity: sha512-EZdQrVnJDkOoNrNxrfMJiRnKCPg/berGGjf7IN876Q4BRDnghB8xqdMCHO2zdisZRFAxL5Ol0zjF6zatYs+BkQ==} + + '@graphai/data_agents@0.2.1': + resolution: {integrity: sha512-Ywof2A3bcINJR+zC+xIY6dmLdcMiPTJKPVEPhrdVsYo4FN4t/sRAqel4qJoSNQNAYOXDRM/ZeE4glSoZCJ5hSw==} + + '@graphai/gemini_agent@0.2.5': + resolution: {integrity: sha512-3oU4lc4Okm9hWO18S05rG65ewHGvG2FFgC14uwBVL75KuzMTniB2lZmSaDEkFkY02n5YFFg45gZ4kHvceKQ40g==} + + '@graphai/gemini_agent@2.0.0': + resolution: {integrity: sha512-5dLckBY8oPSWD3YxVR/nvcvDwbsZQQl0Lf3yXsSb2+glRQJwctlQLXjbXLDJ+K7FJ703akZBbpqpjyjGYdAo2g==} + + '@graphai/groq_agent@0.2.4': + resolution: {integrity: sha512-czvDJrvR+CXi6gMu3N0U/CnmgizjE9V0uwIB6U5flVzSe80AvIGzQtkRQSu9MxZ/GUtBlI0WECQc64loY1365A==} + + '@graphai/groq_agent@2.0.0': + resolution: {integrity: sha512-z9i89s8RLQDzC9K9tjPoAoNAZEbxSj6dFK9/nI5M6XkEa6AyJhI49RgHU7Fnq0EjwBPPCJ0UH861HI0Z4iblVA==} + + '@graphai/http_client_agent_filter@2.0.1': + resolution: {integrity: sha512-wnQ3l9RpdOKgDntCEYB0GOoYfBgg8SVp43cJzcN5ZB/Be207lKVxRpxhRaCAhD1zt4F5xCerxX3eVIPbD+h2cw==} + + '@graphai/input_agents@0.2.2': + resolution: {integrity: sha512-ATBZGiyktFL89QD27WYn0ejjAQ60l2tqr1CWxmp2nPEfAdtI58Tfwvh/9hN1J2aw7ZUaOmB0PYoO+z3ZUSxqQg==} + + '@graphai/llm_agents@0.2.10': + resolution: {integrity: sha512-wtjsBuwaIsWGzM7yNaNiAJMLnQv7dRs4p+oEH3g6gH2zvAp3o9aL4+HlT/9DDWJxH5NQXBJ27oY6z/ezU0FlgQ==} + + '@graphai/llm_agents@2.0.1': + resolution: {integrity: sha512-ZvXtQlwwtMcbuLUwBBuKc7NXGFFAlPk70q0FpEZAvnMAbFAmYhdHxvK+P0lJ+4K2n+QDe0CbMxsup1Q2BG6rqQ==} + + '@graphai/llm_utils@0.2.0': + resolution: {integrity: sha512-8QJxmrbXz2tMPfJVfx0OG4hQzMDLQbs2Mv7sMnYEDbOdZuS11l3kLZeDoA9KGGlts3cT15WjQ/V9tqhT7I24mA==} + + '@graphai/llm_utils@2.0.1': + resolution: {integrity: sha512-hFZ1E7ivaq0rOAWQEj+YDYwTBxTZNProNqp8ImD0dG6euioRFtnuMpBD200Z7cLvnVyRSVnoylSdC8AmdWpYng==} + + '@graphai/namedinput_validator_agent_filter@2.0.1': + resolution: {integrity: sha512-bqUSEkC6mu9Bo7Arh+gnOxsa0QmlpSDAcv90x+bvm6fBkYl5/ir+SBxjsxVnX1K3bWY6/h+HUphf+9UNW0397A==} + + '@graphai/openai_agent@0.2.7': + resolution: {integrity: sha512-vGnPncCZnxBL1gNrivurjTGZpcwu0ofukd2aTb2xNcPBrLwgPECCw6FVe0nTaQOHLMp+RPY//J0U181gJz9Dxw==} + + '@graphai/openai_agent@2.0.3': + resolution: {integrity: sha512-VtA5YdIs0CqLZZoCAbQhwYLcB2ftp/5YCX8hvCe+PTQytifnWr4v3LoVkb9P0kvRXmYtVGK/RzatGEBKyjkn+g==} + + '@graphai/openai_fetch_agent@0.2.2': + resolution: {integrity: sha512-8uGhcuoBH7DPS7l8I70/nrCVMbCw52rBeUrbnJx2Q7s9/4uDaAERw5TEQInPk91/69lNaPW9Vga2mT5JM6baOQ==} + + '@graphai/replicate_agent@0.2.2': + resolution: {integrity: sha512-9h3zIkVQYcHnumC37t6XgV/T10Sln45KXyigm2+J71LPMi3ohGRyVwuuT3RuU4ie1acmoSySAZxn2Bht1tdU0w==} + + '@graphai/replicate_agent@2.0.0': + resolution: {integrity: sha512-6jEg1ZTAPaopA/Xnr2/gbeHP3jrxZP6B0S7P94DBZceA5OOs5CmAfVnG1Ikh3dltJP1HbAhOTdJpVl6hWN/4Yg==} + + '@graphai/service_agents@0.2.0': + resolution: {integrity: sha512-3qq+N9sx/GUMXAqKg4gLSsMrAc3j+xvqK2Qie788JsKAL9QDjxR0FGtmhgXFOmIY0lxiiYvSrrt6G14UFrP2lA==} + + '@graphai/sleeper_agents@0.2.0': + resolution: {integrity: sha512-OMI4Jap5V+uFGLi8IU6Pa7J3B0We/6xEyWA/f7JeaSfmtQs8/yv8wTtJHO+3E6WcUeiCGuuFy6+3ffFXwcO91g==} + + '@graphai/step_runner_agent_filter@2.0.3': + resolution: {integrity: sha512-jVB19kZ6ojEwg6wnTV511H4Tz3myCixlrDQae6IbOd5dc1Ii5vViwX0uBgkn03HcNrVqiKA7FAmwTJIhjnh+NA==} + + '@graphai/stream_agent_filter@2.0.1': + resolution: {integrity: sha512-BeT7OW58inq7jM8tXk7Brhc772G2/6+7M8Sckta01WBIFDx6mQeyLXcth4gYUensGnrhvDTcE4FjI88r3SGBMQ==} + + '@graphai/vanilla@0.2.15': + resolution: {integrity: sha512-+L7TM/43yclAWqo3AC1k63rPGKwrhpA9tK5y5SeAXb4ZqL1q7akDmnENXPIiv+ZbF64/EKyNSl/dEKDK95E6Aw==} + + '@graphai/vanilla@2.0.4': + resolution: {integrity: sha512-rpfFOj4DV2wlYyYh46yx78mqTxvApI/wa/CSg2ti/in16OZWS/z+sCuZ0q+2lkI5E9WyHIyPq76hNbOT6v3cNg==} + '@hookform/resolvers@4.1.3': resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} peerDependencies: @@ -2288,6 +2533,37 @@ packages: cpu: [x64] os: [win32] + '@inquirer/core@10.1.13': + resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.12': + resolution: {integrity: sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.7': + resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2513,8 +2789,8 @@ packages: resolution: {integrity: sha512-qFlpmObPqeUs4u3oFYv/OM/xyX+pNa5TRAjqjvMhbGYlyMhzSrE5UfncL2rUcEeVfD9Gebgff73hPwqcOwJQNA==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.10': - resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -2693,74 +2969,6 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@oxc-resolver/binding-darwin-arm64@11.1.0': - resolution: {integrity: sha512-n9y3Lb1+BwsOtm3BmXSUPu3iDtTq7Sf0gX4e+izFTfNrj+u6uTKqbmlq8ggV8CRdg1zGUaCvKNvg/9q3C/19gg==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.1.0': - resolution: {integrity: sha512-2aJTPN9/lTmq0xw1YYsy5GDPkTyp92EoYRtw9nVgGErwMvA87duuLnIdoztYk66LGa3g5y4RgOaEapZbK7132A==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.1.0': - resolution: {integrity: sha512-GoPEd9GvEyuS1YyqvAhAlccZeBEyHFkrHPEhS/+UTPcrzDzZ16ckJSmZtwOPhci5FWHK/th4L6NPiOnDLGFrqQ==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.1.0': - resolution: {integrity: sha512-mQdQDTbw2/RcJKvMi8RAmDECuEC4waM5jeUBn8Cz1pLVddH8MfYJgKbZJUATBNNaHjw/u+Sq9Q1tcJbm8dhpYQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.1.0': - resolution: {integrity: sha512-HDFQiPl7cX2DVXFlulWOinjqXa5Rj4ydFY9xJCwWAHGx2LmqwLDD8MI0UrHVUaHhLLWn54vjGtwsJK94dtkCwg==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-musl@11.1.0': - resolution: {integrity: sha512-0TFcZSVUQPV1r6sFUf7U2fz0mFCaqh5qMlb2zCioZj0C+xUJghC8bz88/qQUc5SA5K4gqg0WEOXzdqz/mXCLLA==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.1.0': - resolution: {integrity: sha512-crG0iy5U9ac99Xkt9trWo5YvtCoSpPUrNZMeUVDkIy1qy1znfv66CveOgCm0G5TwooIIWLJrtFUqi0AkazS3fw==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-s390x-gnu@11.1.0': - resolution: {integrity: sha512-aPemnsn/FXADFu7/VnSprO8uVb9UhNVdBdrIlAREh3s7LoW1QksKyP8/DlFe0o2E79MRQ3XF1ONOgW5zLcUmzA==} - cpu: [s390x] - os: [linux] - - '@oxc-resolver/binding-linux-x64-gnu@11.1.0': - resolution: {integrity: sha512-eMQ0Iue4Bs0jabCIHiEJbZMPoczdx1oBGOiNS/ykCE76Oos/Hb5uD1FB+Vw4agP2cAxzcp8zHO7MpEW450yswg==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-linux-x64-musl@11.1.0': - resolution: {integrity: sha512-5IjxRv0vWiGb102QmwF+ljutUWA1+BZbdW+58lFOVzVVo29L+m5PrEtijY5kK0FMTDvwb/xFXpGq3/vQx+bpSg==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-wasm32-wasi@11.1.0': - resolution: {integrity: sha512-+yz7LYHKW1GK+fJoHh9JibgIWDeBHf5wiu1tgDD92y5eLFEBxP+CjJ2caTZnVRREH74l03twOfcTR9EaLsEidQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.1.0': - resolution: {integrity: sha512-aTF/1TIq9v86Qy3++YFhKJVKXYSTO54yRRWIXwzpgGvZu41acjN/UsNOG7C2QFy/xdkitrZf1awYgawSqNox3g==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.1.0': - resolution: {integrity: sha512-CxalsPMU4oSoZviLMaw01RhLglyN7jrUUhTDRv4pYGcsRxxt5S7e/wO9P/lm5BYgAAq4TtP5MkGuGuMrm//a0g==} - cpu: [x64] - os: [win32] - - '@petamoriken/float16@3.9.2': - resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3350,33 +3558,33 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@redis/bloom@5.5.5': - resolution: {integrity: sha512-M0GDmw8k0EOFoSpmMjhFUADk/apoano97fLSpT81opgmkkDtBB9iB6l6husxnzK5t2qNz/o0+OCVG9g6lEEwKw==} + '@redis/bloom@5.5.6': + resolution: {integrity: sha512-bNR3mxkwtfuCxNOzfV8B3R5zA1LiN57EH6zK4jVBIgzMzliNuReZXBFGnXvsi80/SYohajn78YdpYI+XNpqL+A==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.5.5 + '@redis/client': ^5.5.6 - '@redis/client@5.5.5': - resolution: {integrity: sha512-1Dv/CVdMNLw0mlROSnmpp4MQu+6YIJX0YR0h3g2hnPdLvk6L7TcRcrUj7BQFGSeZD2MxklAUO+rp09ITUqE5Og==} + '@redis/client@5.5.6': + resolution: {integrity: sha512-M3Svdwt6oSfyfQdqEr0L2HOJH2vK7GgCFx1NfAQvpWAT4+ljoT1L5S5cKT3dA9NJrxrOPDkdoTPWJnIrGCOcmw==} engines: {node: '>= 18'} - '@redis/json@5.5.5': - resolution: {integrity: sha512-Nq8wHjOhwuhD05YPWFPL9RyT3K1VdT37TKvqbhykZA2MWQgjjhLn5i1/6zZ+1b0Zc/Sr9E0eK9J8txk6YJR6EA==} + '@redis/json@5.5.6': + resolution: {integrity: sha512-AIsoe3SsGQagqAmSQHaqxEinm5oCWr7zxPWL90kKaEdLJ+zw8KBznf2i9oK0WUFP5pFssSQUXqnscQKe2amfDQ==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.5.5 + '@redis/client': ^5.5.6 - '@redis/search@5.5.5': - resolution: {integrity: sha512-xM/DKrRhbsMS2QQF5bBPjR7P/QEjWWZDUr92r+UOwkZjvc/kmy0tp7h8zkxBo2jtSF99vkk2mwMzn6fQ8d60aQ==} + '@redis/search@5.5.6': + resolution: {integrity: sha512-JSqasYqO0mVcHL7oxvbySRBBZYRYhFl3W7f0Da7BW8M/r0Z9wCiVrdjnN4/mKBpWZkoJT/iuisLUdPGhpKxBew==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.5.5 + '@redis/client': ^5.5.6 - '@redis/time-series@5.5.5': - resolution: {integrity: sha512-2ifwV75Fv/uVX4n0zqvgqIlIInHZtVj+afjcbXPBD2GhG2AeVfkitTz1bMnGnNDA78sWRYooK42OWH9yqujjyQ==} + '@redis/time-series@5.5.6': + resolution: {integrity: sha512-jkpcgq3NOI3TX7xEAJ3JgesJTxAx7k0m6lNxNsYdEM8KOl+xj7GaB/0CbLkoricZDmFSEAz7ClA1iK9XkGHf+Q==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.5.5 + '@redis/client': ^5.5.6 '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} @@ -3535,18 +3743,42 @@ packages: resolution: {integrity: sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==} engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.0.4': + resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.1.3': resolution: {integrity: sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.1.4': + resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} + engines: {node: '>=18.0.0'} + '@smithy/core@3.4.0': resolution: {integrity: sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==} engines: {node: '>=18.0.0'} + '@smithy/core@3.5.1': + resolution: {integrity: sha512-xSw7bZEFKwOKrm/iv8e2BLt2ur98YZdrRD6nII8ditQeUsY2Q1JmIQ0rpILOhaLKYxxG2ivnoOpokzr9qLyDWA==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.5': resolution: {integrity: sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.6': + resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@2.2.0': resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} @@ -3554,14 +3786,26 @@ packages: resolution: {integrity: sha512-V22KIPXZsE2mc4zEgYGANM/7UbL9jWlOACEolyGyMuTY+jjHJ2PQ0FdopOTS1CS7u6PlAkALmypkv2oQ4aftcg==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@4.0.4': + resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-browser@4.0.3': resolution: {integrity: sha512-oe1d/tfCGVZBMX8O6HApaM4G+fF9JNdyLP7tWXt00epuL/kLOdp/4o9VqheLFeJaXgao+9IaBgs/q/oM48hxzg==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-browser@4.0.4': + resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-config-resolver@4.1.1': resolution: {integrity: sha512-XXCPGjRNwpFWHKQJMKIjGLfFKYULYckFnxGcWmBC2mBf3NsrvUKgqHax4NCqc0TfbDAimPDHOc6HOKtzsXK9Gw==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-config-resolver@4.1.2': + resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-node@2.2.0': resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} engines: {node: '>=14.0.0'} @@ -3570,6 +3814,10 @@ packages: resolution: {integrity: sha512-HOEbRmm9TrikCoFrypYu0J/gC4Lsk8gl5LtOz1G3laD2Jy44+ht2Pd2E9qjNQfhMJIzKDZ/gbuUH0s0v4kWQ0A==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-node@4.0.4': + resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-universal@2.2.0': resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} engines: {node: '>=14.0.0'} @@ -3578,6 +3826,10 @@ packages: resolution: {integrity: sha512-ShOP512CZrYI9n+h64PJ84udzoNHUQtPddyh1j175KNTKsSnMEDNscOWJWyEoLQiuhWWw51lSa+k6ea9ZGXcRg==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-universal@4.0.4': + resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} + engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@2.5.0': resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} @@ -3585,14 +3837,34 @@ packages: resolution: {integrity: sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==} engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.0.4': + resolution: {integrity: sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.0.4': + resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} + engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.0.3': resolution: {integrity: sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==} engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.0.4': + resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.0.4': + resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} + engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.0.3': resolution: {integrity: sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==} engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.0.4': + resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} + engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -3605,10 +3877,18 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.0.4': + resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.0.3': resolution: {integrity: sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==} engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.0.4': + resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@2.5.1': resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} engines: {node: '>=14.0.0'} @@ -3617,6 +3897,14 @@ packages: resolution: {integrity: sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.1.9': + resolution: {integrity: sha512-AjDgX4UjORLltD/LZCBQTwjQqEfyrx/GeDTHcYLzIgf87pIT70tMWnN87NQpJru1K4ITirY2htSOxNECZJCBOg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.1.10': + resolution: {integrity: sha512-RyhcA3sZIIvAo6r48b2Nx2qfg0OnyohlaV0fw415xrQyx5HQ2bvHl9vs/WBiDXIP49mCfws5wX4308c9Pi/isw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.1.8': resolution: {integrity: sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==} engines: {node: '>=18.0.0'} @@ -3629,6 +3917,10 @@ packages: resolution: {integrity: sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.0.8': + resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@2.2.0': resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} engines: {node: '>=14.0.0'} @@ -3637,6 +3929,10 @@ packages: resolution: {integrity: sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.0.4': + resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@2.3.0': resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} engines: {node: '>=14.0.0'} @@ -3645,6 +3941,10 @@ packages: resolution: {integrity: sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.1.3': + resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@2.5.0': resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} engines: {node: '>=14.0.0'} @@ -3653,6 +3953,10 @@ packages: resolution: {integrity: sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.0.6': + resolution: {integrity: sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@2.2.0': resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} @@ -3661,6 +3965,10 @@ packages: resolution: {integrity: sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.0.4': + resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@3.3.0': resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} engines: {node: '>=14.0.0'} @@ -3669,6 +3977,10 @@ packages: resolution: {integrity: sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.1.2': + resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@2.2.0': resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} engines: {node: '>=14.0.0'} @@ -3677,6 +3989,10 @@ packages: resolution: {integrity: sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==} engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.0.4': + resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@2.2.0': resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} engines: {node: '>=14.0.0'} @@ -3685,10 +4001,18 @@ packages: resolution: {integrity: sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==} engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.0.4': + resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.0.4': resolution: {integrity: sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==} engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.0.5': + resolution: {integrity: sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==} + engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@2.4.0': resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} engines: {node: '>=14.0.0'} @@ -3697,6 +4021,10 @@ packages: resolution: {integrity: sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.0.4': + resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@3.1.2': resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} @@ -3705,6 +4033,10 @@ packages: resolution: {integrity: sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==} engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.1.2': + resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@2.5.1': resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==} engines: {node: '>=14.0.0'} @@ -3713,6 +4045,10 @@ packages: resolution: {integrity: sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.4.1': + resolution: {integrity: sha512-XPbcHRfd0iwx8dY5XCBCGyI7uweMW0oezYezxXcG8ANgvZ5YPuC6Ylh+n0bTHpdU3SCMZOnhzgVklYz+p3fIhw==} + engines: {node: '>=18.0.0'} + '@smithy/types@2.12.0': resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} engines: {node: '>=14.0.0'} @@ -3725,6 +4061,10 @@ packages: resolution: {integrity: sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==} engines: {node: '>=18.0.0'} + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@2.2.0': resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} @@ -3732,6 +4072,10 @@ packages: resolution: {integrity: sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.0.4': + resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@2.3.0': resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} engines: {node: '>=14.0.0'} @@ -3768,14 +4112,26 @@ packages: resolution: {integrity: sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.0.17': + resolution: {integrity: sha512-HXq5181qnXmIwB7VrwqwP8rsJybHMoYuJnNoXy4PROs2pfSI4sWDMASF2i+7Lo+u64Y6xowhegcdxczowgJtZg==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.0.15': resolution: {integrity: sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.0.17': + resolution: {integrity: sha512-RfU2A5LjFhEHw4Nwl1GZNitK4AUWu5jGtigAUDoQtfDUvYHpQxcuLw2QGAdKDtKRflIiHSZ8wXBDR36H9R2Ang==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.0.5': resolution: {integrity: sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.0.6': + resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@2.2.0': resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==} engines: {node: '>=14.0.0'} @@ -3800,10 +4156,18 @@ packages: resolution: {integrity: sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.0.4': + resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.0.4': resolution: {integrity: sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.0.5': + resolution: {integrity: sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@2.2.0': resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} engines: {node: '>=14.0.0'} @@ -3812,6 +4176,10 @@ packages: resolution: {integrity: sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.2.2': + resolution: {integrity: sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@2.2.0': resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==} engines: {node: '>=14.0.0'} @@ -3836,6 +4204,10 @@ packages: resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.0.5': + resolution: {integrity: sha512-4QvC49HTteI1gfemu0I1syWovJgPvGn7CVUoN9ZFkdvr/cCFkrEL7qNCdx/2eICqDWEGnnr68oMdSIPCLAriSQ==} + engines: {node: '>=18.0.0'} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -3901,10 +4273,10 @@ packages: react-dom: optional: true - '@storybook/builder-vite@9.0.5': - resolution: {integrity: sha512-mr2IqmNmlCWQCxorglo2diGcCIDwaZEJWG6noWkMPW6ri/Nh4y8DQYbK7hUK3O3sGLdV4QfTPCbRPGgMtBb07g==} + '@storybook/builder-vite@9.0.8': + resolution: {integrity: sha512-dbwDfBUwLW8I71h0Y9r+twtEdjKC+oBP1YweS26ET78qc6qXMFsK5Tfh6lzj/vQbmxY0YhnTVrrkXgfR0erLPA==} peerDependencies: - storybook: ^9.0.5 + storybook: ^9.0.8 vite: ^5.0.0 || ^6.0.0 '@storybook/components@8.6.12': @@ -3922,10 +4294,10 @@ packages: peerDependencies: storybook: ^8.6.12 - '@storybook/csf-plugin@9.0.5': - resolution: {integrity: sha512-dO+2J3GlIK1pRpXVL9CXhENwmaF0bF6jji+MtUXRHooHtbgtogaTGlYffBnIojuXHnskR6BAaMUPPLVOVY6Ctw==} + '@storybook/csf-plugin@9.0.8': + resolution: {integrity: sha512-mNjo4t9liAbQvhE9ni87NU2sz9tqFU4Y54ioSFDlW24wpubsvnhBi5h4z3EkeQJSzIzNMRym9SC7Elbqa3Kf+g==} peerDependencies: - storybook: ^9.0.5 + storybook: ^9.0.8 '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} @@ -3949,29 +4321,29 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.12 - '@storybook/react-dom-shim@9.0.5': - resolution: {integrity: sha512-lMlYoiuJJm9UcUPYYkVNtJu8Xv23fMKqf0k0SF3JB/efaSiaiCNR+fH2g81FrdntOkfFU3YWQ8DUY5TYH73HeA==} + '@storybook/react-dom-shim@9.0.8': + resolution: {integrity: sha512-SYyjRagHZx724hGEWSZcXRzj82am77OpqeA9ps6ZsCSn4cVY9FORGEeY2bnlQkpLnDUH5yjdV/oh+0fXDbl/8g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.5 + storybook: ^9.0.8 - '@storybook/react-vite@9.0.5': - resolution: {integrity: sha512-FZH7T+hfoS8DMLICfX8E/LDPjrBTHmKvH4dZALZniVKlH0ML2w4ru9M+Lt0w2aPP2NPemnPiPH3aajIQjofY3Q==} + '@storybook/react-vite@9.0.8': + resolution: {integrity: sha512-nAtT9UeOkKCBJ2kbatC7Hf/TX3Kl+e21wvc1D5xpS86ulPamzjzxLD5nW+vliBKePOo+9ZW/KQZYCLg3snRJtQ==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.5 + storybook: ^9.0.8 vite: ^5.0.0 || ^6.0.0 - '@storybook/react@9.0.5': - resolution: {integrity: sha512-qBEUaiGd1d2SQllhcMrBwwnzwWJWHw5XiTeq5MsjkEy2Oqfm7kWqTdGSkMbW/MoeFX5foO+Mu7nLqM9s4GxNXg==} + '@storybook/react@9.0.8': + resolution: {integrity: sha512-in3O+lDmxKRhdcX3Wg6FbLnb2/PuqRL+rUKMz1wr1ndSkw4J1jGsvP909oEEYnDbjHOX0xnNxxbEapO4F9fgBQ==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.5 + storybook: ^9.0.8 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: @@ -4174,16 +4546,16 @@ packages: '@tanstack/query-core@5.76.0': resolution: {integrity: sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==} - '@tanstack/query-core@5.80.2': - resolution: {integrity: sha512-g2Es97uwFk7omkWiH9JmtLWSA8lTUFVseIyzqbjqJEEx7qN+Hg6jbBdDvelqtakamppaJtGORQ64hEJ5S6ojSg==} + '@tanstack/query-core@5.80.6': + resolution: {integrity: sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==} '@tanstack/react-query@5.76.1': resolution: {integrity: sha512-YxdLZVGN4QkT5YT1HKZQWiIlcgauIXEIsMOTSjvyD5wLYK8YVvKZUPAysMqossFJJfDpJW3pFn7WNZuPOqq+fw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-query@5.80.2': - resolution: {integrity: sha512-LfA0SVheJBOqC8RfJw/JbOW3yh2zuONQeWU5Prjm7yjUGUONeOedky1Bj39Cfj8MRdXrZV+DxNT7/DN/M907lQ==} + '@tanstack/react-query@5.80.6': + resolution: {integrity: sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw==} peerDependencies: react: ^18 || ^19 @@ -4216,6 +4588,10 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@tne/tne-agent-v2@file:packages/tne-tne-agent-v2-0.0.1.j.tgz': + resolution: {integrity: sha512-2Td8NmpF0ZN+wKwfhN9Hodhn5mQS7TVWvJgogYv39p02kAz/v0pNkHr+fHAd1A4ufoJMuOAts/YdlBIN/jekRw==, tarball: file:packages/tne-tne-agent-v2-0.0.1.j.tgz} + version: 0.0.1 + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -4437,8 +4813,8 @@ packages: '@types/node@20.17.50': resolution: {integrity: sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A==} - '@types/node@20.17.57': - resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} + '@types/node@20.19.0': + resolution: {integrity: sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==} '@types/node@22.15.20': resolution: {integrity: sha512-A6BohGFRGHAscJsTslDCA9JG7qSJr/DWUvrvY8yi9IgnGtMxCyat7vvQ//MFa0DnLsyuS3wYTpLdw4Hf+Q5JXw==} @@ -4511,6 +4887,9 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/xml2js@0.4.14': + resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -4589,8 +4968,8 @@ packages: '@vitest/expect@3.2.0': resolution: {integrity: sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA==} - '@vitest/expect@3.2.1': - resolution: {integrity: sha512-FqS/BnDOzV6+IpxrTg5GQRyLOCtcJqkwMwcS8qGCI2IyRVDwPAtutztaf1CjtPHlZlWtl1yUPCd7HM0cNiDOYw==} + '@vitest/expect@3.2.2': + resolution: {integrity: sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==} '@vitest/mocker@3.1.3': resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==} @@ -4614,8 +4993,8 @@ packages: vite: optional: true - '@vitest/mocker@3.2.1': - resolution: {integrity: sha512-OXxMJnx1lkB+Vl65Re5BrsZEHc90s5NMjD23ZQ9NlU7f7nZiETGoX4NeKZSmsKjseuMq2uOYXdLOeoM0pJU+qw==} + '@vitest/mocker@3.2.2': + resolution: {integrity: sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -4634,8 +5013,8 @@ packages: '@vitest/pretty-format@3.2.0': resolution: {integrity: sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw==} - '@vitest/pretty-format@3.2.1': - resolution: {integrity: sha512-xBh1X2GPlOGBupp6E1RcUQWIxw0w/hRLd3XyBS6H+dMdKTAqHDNsIR2AnJwPA3yYe9DFy3VUKTe3VRTrAiQ01g==} + '@vitest/pretty-format@3.2.2': + resolution: {integrity: sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==} '@vitest/runner@3.1.3': resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==} @@ -4643,8 +5022,8 @@ packages: '@vitest/runner@3.2.0': resolution: {integrity: sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA==} - '@vitest/runner@3.2.1': - resolution: {integrity: sha512-kygXhNTu/wkMYbwYpS3z/9tBe0O8qpdBuC3dD/AW9sWa0LE/DAZEjnHtWA9sIad7lpD4nFW1yQ+zN7mEKNH3yA==} + '@vitest/runner@3.2.2': + resolution: {integrity: sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==} '@vitest/snapshot@3.1.3': resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==} @@ -4652,8 +5031,8 @@ packages: '@vitest/snapshot@3.2.0': resolution: {integrity: sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A==} - '@vitest/snapshot@3.2.1': - resolution: {integrity: sha512-5xko/ZpW2Yc65NVK9Gpfg2y4BFvcF+At7yRT5AHUpTg9JvZ4xZoyuRY4ASlmNcBZjMslV08VRLDrBOmUe2YX3g==} + '@vitest/snapshot@3.2.2': + resolution: {integrity: sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==} '@vitest/spy@3.0.9': resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} @@ -4664,8 +5043,8 @@ packages: '@vitest/spy@3.2.0': resolution: {integrity: sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw==} - '@vitest/spy@3.2.1': - resolution: {integrity: sha512-Nbfib34Z2rfcJGSetMxjDCznn4pCYPZOtQYox2kzebIJcgH75yheIKd5QYSFmR8DIZf2M8fwOm66qSDIfRFFfQ==} + '@vitest/spy@3.2.2': + resolution: {integrity: sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==} '@vitest/utils@3.0.9': resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} @@ -4676,8 +5055,8 @@ packages: '@vitest/utils@3.2.0': resolution: {integrity: sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw==} - '@vitest/utils@3.2.1': - resolution: {integrity: sha512-KkHlGhePEKZSub5ViknBcN5KEF+u7dSUr9NW8QsVICusUojrgrOnnY3DEWWO877ax2Pyopuk2qHmt+gkNKnBVw==} + '@vitest/utils@3.2.2': + resolution: {integrity: sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==} '@vscode/codicons@0.0.36': resolution: {integrity: sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ==} @@ -4801,6 +5180,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -5093,6 +5475,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -5140,6 +5525,10 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5269,6 +5658,10 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -6091,10 +6484,6 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -6238,16 +6627,6 @@ packages: jiti: optional: true - eslint@9.28.0: - resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6303,6 +6682,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource-parser@3.0.2: resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} engines: {node: '>=18.0.0'} @@ -6401,12 +6784,15 @@ packages: fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fast-xml-parser@5.2.3: - resolution: {integrity: sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true fastest-levenshtein@1.0.16: @@ -6422,8 +6808,8 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-package-json@2.0.0: - resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fd-package-json@1.2.0: + resolution: {integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -6519,8 +6905,8 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} - formatly@0.2.4: - resolution: {integrity: sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==} + formatly@0.2.3: + resolution: {integrity: sha512-WH01vbXEjh9L3bqn5V620xUAWs32CmK4IzWRRY6ep5zpa/mrisL4d9+pRVuETORVDTQw8OycSO1WC68PL51RaA==} engines: {node: '>=18.3.0'} hasBin: true @@ -6608,11 +6994,6 @@ packages: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} - gel@2.1.0: - resolution: {integrity: sha512-HCeRqInCt6BjbMmeghJ6BKeYwOj7WJT5Db6IWWAA3IMUUa7or7zJfTUEkUWCxiOtoXnwnm96sFK9Fr47Yh2hOA==} - engines: {node: '>= 18.0.0'} - hasBin: true - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -6736,9 +7117,18 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphai@2.0.5: + resolution: {integrity: sha512-Qo9KX006YF5SFK4taytTjZJVPnEzHIlCHq3/m2CfZDEDEBYIgo0WpMSEaH4thRRhy0mm5U/4i6AImq1oUqsqdQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + groq-sdk@0.14.0: + resolution: {integrity: sha512-u8+pPPWBb2kdZNPBNvpqk2yHwiAwdcWwKnCLhaFrqzwYnFvBCwFWEkR65H+IgWdVyJmo0ZYDrzqbwb5TTaKanQ==} + + groq-sdk@0.22.0: + resolution: {integrity: sha512-wLkIFlfbi6u9BM8x79wt+yKYqUHoF//od2P5U0MMZRvj/hR+sCZxx1E/ymSGP+M5/fER85MHhPOd/8q3BP4BbQ==} + gtoken@7.1.0: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} @@ -6940,6 +7330,9 @@ packages: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + infobox-parser@3.6.4: + resolution: {integrity: sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -7487,6 +7880,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -7548,8 +7944,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - knip@5.60.0: - resolution: {integrity: sha512-r6oIbaV0Ztz/7DKe1voxg2O5IRhLi9Q0GjhplfRqUZ1gvTChew6ywmLzehuaXIHVKkPs8LF5UKOxFlc93RKzow==} + knip@5.55.1: + resolution: {integrity: sha512-NYXjgGrXgMdabUKCP2TlBH/e83m9KnLc1VLyWHUtoRrCEJ/C15YtbafrpTvm3td+jE4VdDPgudvXT1IMtCx8lw==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -7582,7 +7978,6 @@ packages: libsql@0.5.12: resolution: {integrity: sha512-TikiQZ1j4TwFEqVdJdTM9ZTti28is/ytGEvn0S2MocOj69UKQetWACe/qd8KAD5VeNnQSVd6Nlm2AJx0DFW9Ag==} - cpu: [x64, arm64, wasm32, arm] os: [darwin, linux, win32] lie@3.3.0: @@ -8190,6 +8585,10 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -8455,9 +8854,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-resolver@11.1.0: - resolution: {integrity: sha512-/W/9O6m7lkDJMIXtXvNKXE6THIoNWwstsKpR/R8+yI9e7vC9wu92MDqLBxkgckZ2fTFmKEjozTxVibHBaRUgCA==} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -8765,8 +9161,8 @@ packages: rrweb-snapshot: optional: true - posthog-js@1.249.2: - resolution: {integrity: sha512-OMXCO/IfcJBjYTuebVynMbp8Kq329yKEQSCAnkqLmi8W2Bt5bi7S5xxMwDM3Pm7818Uh0C40XMG3rAtYozId6Q==} + posthog-js@1.249.4: + resolution: {integrity: sha512-Qq4cxDZ1P9BkwguuoVNTiLGQiET9vrzwjYWLS3DduKhRXqEzERLl9tOq2X8ZNPbo+D207+FILdWg/dTKUItfDg==} peerDependencies: '@rrweb/types': 2.0.0-alpha.17 rrweb-snapshot: 2.0.0-alpha.17 @@ -8821,6 +9217,10 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -9074,6 +9474,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -9104,8 +9508,8 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - redis@5.5.5: - resolution: {integrity: sha512-x7vpciikEY7nptGzQrE5I+/pvwFZJDadPk/uEoyGSg/pZ2m/CX2n5EhSgUh+S5T7Gz3uKM6YzWcXEu3ioAsdFQ==} + redis@5.5.6: + resolution: {integrity: sha512-hbpqBfcuhWHOS9YLNcXcJ4akNr7HFX61Dq3JuFZ9S7uU7C7kvnzuH2PDIXOP62A3eevvACoG8UacuXP3N07xdg==} engines: {node: '>= 18'} reflect.getprototypeof@1.0.10: @@ -9152,10 +9556,18 @@ packages: remove-markdown@0.6.2: resolution: {integrity: sha512-EijDXJZbzpGbQBd852ViUzcqgpMujthM+SAEHiWCMcZonRbZ+xViWKLJA/vrwbDwYdxrs1aFDjpBhcGrZoJRGA==} + replicate@1.0.1: + resolution: {integrity: sha512-EY+rK1YR5bKHcM9pd6WyaIbv6m2aRIvHfHDh51j/LahlHTLKemTYXF6ptif2sLa+YospupAsIoxw8Ndt5nI3vg==} + engines: {git: '>=2.11.0', node: '>=18.0.0', npm: '>=7.19.0', yarn: '>=1.7.0'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -9352,10 +9764,6 @@ packages: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - shiki@3.4.1: resolution: {integrity: sha512-PSnoczt+iWIOB4iRQ+XVPFtTuN1FcmuYzPgUBZTSv5pC6CozssIx2M4O5n4S9gJlUu9A3FxMU0ZPaHflky/6LA==} @@ -9518,8 +9926,8 @@ packages: storybook-dark-mode@4.0.2: resolution: {integrity: sha512-zjcwwQ01R5t1VsakA6alc2JDIRVtavryW8J3E3eKLDIlAMcvsgtpxlelWkZs2cuNspk6Z10XzhQVrUWtYc3F0w==} - storybook@9.0.5: - resolution: {integrity: sha512-4RIyN7P6R6umcgAB6jv3GSIDA0qw9iRcm3KnIR6VhLKLKlbbmDsUs/JmjLobxL5W+LB4zbCbrBcFsW7AL2MSyA==} + storybook@9.0.8: + resolution: {integrity: sha512-GlOB3HAtzRYc237+o46nnETNkc2Qckh3UrIJ1rJyAzagIlPWau/jTxjSz76sqRODEnt01m8CyIkw3PGv0q1UpQ==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -9643,8 +10051,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-json-comments@5.0.2: - resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} + strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} strnum@1.1.2: @@ -10310,8 +10718,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-node@3.2.1: - resolution: {integrity: sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA==} + vite-node@3.2.2: + resolution: {integrity: sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -10411,16 +10819,16 @@ packages: jsdom: optional: true - vitest@3.2.1: - resolution: {integrity: sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==} + vitest@3.2.2: + resolution: {integrity: sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.1 - '@vitest/ui': 3.2.1 + '@vitest/browser': 3.2.2 + '@vitest/ui': 3.2.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -10476,9 +10884,8 @@ packages: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} - walk-up-path@4.0.0: - resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} - engines: {node: 20 || >=22} + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -10582,6 +10989,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wikipedia@2.1.2: + resolution: {integrity: sha512-RAYaMpXC9/E873RaSEtlEa8dXK4e0p5k98GKOd210MtkE5emm6fcnwD+N6ZA4cuffjDWagvhaQKtp/mGp2BOVQ==} + engines: {node: '>=10'} + windows-release@6.1.0: resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} engines: {node: '>=18'} @@ -10596,6 +11007,10 @@ packages: workerpool@9.2.0: resolution: {integrity: sha512-PKZqBOCo6CYkVOwAxWxQaSF2Fvb5Iv2fCeTP7buyWI2GiynWr46NcXSgK/idoV6e60dgCBfgYc+Un3HMvmqP8w==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -10635,6 +11050,10 @@ packages: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + xmlbuilder@10.1.1: resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} engines: {node: '>=4.0'} @@ -10711,6 +11130,10 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -10738,11 +11161,8 @@ packages: zod@3.24.4: resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - zod@3.25.49: - resolution: {integrity: sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==} - - zod@3.25.51: - resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} + zod@3.25.56: + resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -10782,6 +11202,18 @@ snapshots: - aws-crt - encoding + '@anthropic-ai/sdk@0.36.3': + dependencies: + '@types/node': 18.19.100 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + '@anthropic-ai/sdk@0.37.0': dependencies: '@types/node': 18.19.100 @@ -10794,6 +11226,8 @@ snapshots: transitivePeerDependencies: - encoding + '@anthropic-ai/sdk@0.52.0': {} + '@anthropic-ai/vertex-sdk@0.7.0': dependencies: '@anthropic-ai/sdk': 0.37.0 @@ -10814,6 +11248,21 @@ snapshots: '@aws-sdk/types': 3.804.0 tslib: 2.8.1 + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-locate-window': 3.804.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -10954,6 +11403,67 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-s3@3.823.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.823.0 + '@aws-sdk/credential-provider-node': 3.823.0 + '@aws-sdk/middleware-bucket-endpoint': 3.821.0 + '@aws-sdk/middleware-expect-continue': 3.821.0 + '@aws-sdk/middleware-flexible-checksums': 3.823.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-location-constraint': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-sdk-s3': 3.823.0 + '@aws-sdk/middleware-ssec': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.823.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/signature-v4-multi-region': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.823.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.1 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-blob-browser': 4.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/hash-stream-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/md5-js': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.9 + '@smithy/middleware-retry': 4.1.10 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.17 + '@smithy/util-defaults-mode-node': 4.0.17 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.5 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-sso@3.817.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -10997,6 +11507,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sso@3.823.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.823.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.823.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.823.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.1 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.9 + '@smithy/middleware-retry': 4.1.10 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.17 + '@smithy/util-defaults-mode-node': 4.0.17 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/core@3.816.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11011,6 +11564,24 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 + '@aws-sdk/core@3.823.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/core': 3.5.1 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-utf8': 4.0.0 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-cognito-identity@3.817.0': dependencies: '@aws-sdk/client-cognito-identity': 3.817.0 @@ -11029,6 +11600,14 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.816.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11042,6 +11621,19 @@ snapshots: '@smithy/util-stream': 4.2.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/credential-provider-ini@3.817.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11060,6 +11652,24 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/credential-provider-env': 3.823.0 + '@aws-sdk/credential-provider-http': 3.823.0 + '@aws-sdk/credential-provider-process': 3.823.0 + '@aws-sdk/credential-provider-sso': 3.823.0 + '@aws-sdk/credential-provider-web-identity': 3.823.0 + '@aws-sdk/nested-clients': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.817.0': dependencies: '@aws-sdk/credential-provider-env': 3.816.0 @@ -11077,6 +11687,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.823.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.823.0 + '@aws-sdk/credential-provider-http': 3.823.0 + '@aws-sdk/credential-provider-ini': 3.823.0 + '@aws-sdk/credential-provider-process': 3.823.0 + '@aws-sdk/credential-provider-sso': 3.823.0 + '@aws-sdk/credential-provider-web-identity': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.816.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11086,6 +11713,15 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-process@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-sso@3.817.0': dependencies: '@aws-sdk/client-sso': 3.817.0 @@ -11099,6 +11735,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.823.0': + dependencies: + '@aws-sdk/client-sso': 3.823.0 + '@aws-sdk/core': 3.823.0 + '@aws-sdk/token-providers': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.817.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11110,6 +11759,17 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/nested-clients': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-providers@3.817.0': dependencies: '@aws-sdk/client-cognito-identity': 3.817.0 @@ -11141,6 +11801,16 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-bucket-endpoint@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-eventstream@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11148,6 +11818,29 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.823.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11155,12 +11848,31 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11168,6 +11880,36 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/core': 3.5.1 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.816.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11178,6 +11920,16 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@smithy/core': 3.5.1 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.817.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -11221,6 +11973,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.823.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.823.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.823.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.823.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.1 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.9 + '@smithy/middleware-retry': 4.1.10 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.17 + '@smithy/util-defaults-mode-node': 4.0.17 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11230,6 +12025,24 @@ snapshots: '@smithy/util-middleware': 4.0.3 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.823.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.817.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -11242,11 +12055,32 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.823.0': + dependencies: + '@aws-sdk/core': 3.823.0 + '@aws-sdk/nested-clients': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.804.0': dependencies: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/types@3.821.0': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.804.0': + dependencies: + tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -11254,6 +12088,13 @@ snapshots: '@smithy/util-endpoints': 3.0.5 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + '@smithy/util-endpoints': 3.0.6 + tslib: 2.8.1 + '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 @@ -11265,6 +12106,13 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-browser@3.821.0': + dependencies: + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + bowser: 2.11.0 + tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.816.0': dependencies: '@aws-sdk/middleware-user-agent': 3.816.0 @@ -11273,10 +12121,23 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.823.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.823.0 + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 + '@aws-sdk/xml-builder@3.821.0': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@azure/abort-controller@2.1.2': dependencies: tslib: 2.8.1 @@ -11536,8 +12397,6 @@ snapshots: '@babel/runtime@7.27.4': {} - '@babel/runtime@7.27.6': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -11997,11 +12856,6 @@ snapshots: eslint: 9.27.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': - dependencies: - eslint: 9.28.0(jiti@2.4.2) - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.20.0': @@ -12034,8 +12888,6 @@ snapshots: '@eslint/js@9.27.0': {} - '@eslint/js@9.28.0': {} - '@eslint/object-schema@2.1.6': {} '@eslint/plugin-kit@0.3.1': @@ -12062,19 +12914,201 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@google/genai@1.3.0(@modelcontextprotocol/sdk@1.12.0)': + '@google/genai@1.4.0(@modelcontextprotocol/sdk@1.12.0)': dependencies: '@modelcontextprotocol/sdk': 1.12.0 google-auth-library: 9.15.1 ws: 8.18.2 - zod: 3.25.51 - zod-to-json-schema: 3.24.5(zod@3.25.51) + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate + '@google/generative-ai@0.21.0': {} + + '@google/generative-ai@0.24.1': {} + + '@graphai/agent_filter_utils@2.0.0': {} + + '@graphai/agent_filters@2.0.0(@types/node@20.17.50)': + dependencies: + '@graphai/agent_filter_utils': 2.0.0 + '@graphai/cache_agent_filter': 2.0.2 + '@graphai/http_client_agent_filter': 2.0.1 + '@graphai/namedinput_validator_agent_filter': 2.0.1 + '@graphai/step_runner_agent_filter': 2.0.3(@types/node@20.17.50) + '@graphai/stream_agent_filter': 2.0.1 + transitivePeerDependencies: + - '@types/node' + + '@graphai/agent_utils@0.0.3': {} + + '@graphai/agent_utils@2.0.1': {} + + '@graphai/agents@0.2.10(@types/node@20.17.50)(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@graphai/data_agents': 0.2.1 + '@graphai/input_agents': 0.2.2(@types/node@20.17.50) + '@graphai/llm_agents': 0.2.10(ws@8.18.2)(zod@3.24.4) + '@graphai/service_agents': 0.2.0 + '@graphai/sleeper_agents': 0.2.0 + '@graphai/vanilla': 0.2.15 + transitivePeerDependencies: + - '@types/node' + - debug + - encoding + - ws + - zod + + '@graphai/anthropic_agent@0.2.3': + dependencies: + '@anthropic-ai/sdk': 0.36.3 + '@graphai/llm_utils': 0.2.0 + transitivePeerDependencies: + - encoding + + '@graphai/anthropic_agent@2.0.2': + dependencies: + '@anthropic-ai/sdk': 0.52.0 + '@graphai/llm_utils': 2.0.1 + + '@graphai/cache_agent_filter@2.0.2': + dependencies: + '@noble/hashes': 1.8.0 + + '@graphai/data_agents@0.2.1': + dependencies: + deepmerge: 4.3.1 + + '@graphai/gemini_agent@0.2.5': + dependencies: + '@google/generative-ai': 0.21.0 + '@graphai/llm_utils': 0.2.0 + + '@graphai/gemini_agent@2.0.0': + dependencies: + '@google/generative-ai': 0.24.1 + '@graphai/llm_utils': 2.0.1 + + '@graphai/groq_agent@0.2.4': + dependencies: + '@graphai/llm_utils': 0.2.0 + groq-sdk: 0.14.0 + transitivePeerDependencies: + - encoding + + '@graphai/groq_agent@2.0.0': + dependencies: + '@graphai/llm_utils': 2.0.1 + groq-sdk: 0.22.0 + transitivePeerDependencies: + - encoding + + '@graphai/http_client_agent_filter@2.0.1': {} + + '@graphai/input_agents@0.2.2(@types/node@20.17.50)': + dependencies: + '@inquirer/input': 4.1.12(@types/node@20.17.50) + transitivePeerDependencies: + - '@types/node' + + '@graphai/llm_agents@0.2.10(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@graphai/anthropic_agent': 0.2.3 + '@graphai/gemini_agent': 0.2.5 + '@graphai/groq_agent': 0.2.4 + '@graphai/openai_agent': 0.2.7(ws@8.18.2)(zod@3.24.4) + '@graphai/replicate_agent': 0.2.2 + transitivePeerDependencies: + - encoding + - ws + - zod + + '@graphai/llm_agents@2.0.1(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@graphai/anthropic_agent': 2.0.2 + '@graphai/gemini_agent': 2.0.0 + '@graphai/groq_agent': 2.0.0 + '@graphai/openai_agent': 2.0.3(ws@8.18.2)(zod@3.24.4) + '@graphai/openai_fetch_agent': 0.2.2 + '@graphai/replicate_agent': 2.0.0 + transitivePeerDependencies: + - encoding + - ws + - zod + + '@graphai/llm_utils@0.2.0': {} + + '@graphai/llm_utils@2.0.1': {} + + '@graphai/namedinput_validator_agent_filter@2.0.1': + dependencies: + ajv: 8.17.1 + + '@graphai/openai_agent@0.2.7(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@graphai/llm_utils': 0.2.0 + openai: 4.103.0(ws@8.18.2)(zod@3.24.4) + transitivePeerDependencies: + - encoding + - ws + - zod + + '@graphai/openai_agent@2.0.3(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@graphai/llm_utils': 2.0.1 + openai: 4.103.0(ws@8.18.2)(zod@3.24.4) + transitivePeerDependencies: + - encoding + - ws + - zod + + '@graphai/openai_fetch_agent@0.2.2': + dependencies: + '@graphai/llm_utils': 0.2.0 + + '@graphai/replicate_agent@0.2.2': + dependencies: + '@graphai/llm_utils': 0.2.0 + replicate: 1.0.1 + + '@graphai/replicate_agent@2.0.0': + dependencies: + '@graphai/llm_utils': 2.0.1 + replicate: 1.0.1 + + '@graphai/service_agents@0.2.0': + dependencies: + '@types/xml2js': 0.4.14 + deepmerge: 4.3.1 + wikipedia: 2.1.2 + xml2js: 0.6.2 + transitivePeerDependencies: + - debug + + '@graphai/sleeper_agents@0.2.0': + dependencies: + deepmerge: 4.3.1 + + '@graphai/step_runner_agent_filter@2.0.3(@types/node@20.17.50)': + dependencies: + '@inquirer/input': 4.1.12(@types/node@20.17.50) + transitivePeerDependencies: + - '@types/node' + + '@graphai/stream_agent_filter@2.0.1': {} + + '@graphai/vanilla@0.2.15': + dependencies: + '@graphai/agent_utils': 0.0.3 + + '@graphai/vanilla@2.0.4': + dependencies: + '@graphai/agent_utils': 2.0.1 + '@hookform/resolvers@4.1.3(react-hook-form@7.57.0(react@18.3.1))': dependencies: '@standard-schema/utils': 0.3.0 @@ -12183,6 +13217,32 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/core@10.1.13(@types/node@20.17.50)': + dependencies: + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@20.17.50) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.17.50 + + '@inquirer/figures@1.0.12': {} + + '@inquirer/input@4.1.12(@types/node@20.17.50)': + dependencies: + '@inquirer/core': 10.1.13(@types/node@20.17.50) + '@inquirer/type': 3.0.7(@types/node@20.17.50) + optionalDependencies: + '@types/node': 20.17.50 + + '@inquirer/type@3.0.7(@types/node@20.17.50)': + optionalDependencies: + '@types/node': 20.17.50 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -12531,8 +13591,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.49 - zod-to-json-schema: 3.24.5(zod@3.25.49) + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) transitivePeerDependencies: - supports-color @@ -12545,7 +13605,7 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@napi-rs/wasm-runtime@0.2.10': + '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 '@emnapi/runtime': 1.4.3 @@ -12624,7 +13684,7 @@ snapshots: '@node-rs/crc32-wasm32-wasi@1.10.6': dependencies: - '@napi-rs/wasm-runtime': 0.2.10 + '@napi-rs/wasm-runtime': 0.2.11 optional: true '@node-rs/crc32-win32-arm64-msvc@1.10.6': @@ -12674,50 +13734,6 @@ snapshots: '@open-draft/until@2.1.0': {} - '@oxc-resolver/binding-darwin-arm64@11.1.0': - optional: true - - '@oxc-resolver/binding-darwin-x64@11.1.0': - optional: true - - '@oxc-resolver/binding-freebsd-x64@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-arm64-gnu@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-arm64-musl@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-riscv64-gnu@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-s390x-gnu@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-x64-gnu@11.1.0': - optional: true - - '@oxc-resolver/binding-linux-x64-musl@11.1.0': - optional: true - - '@oxc-resolver/binding-wasm32-wasi@11.1.0': - dependencies: - '@napi-rs/wasm-runtime': 0.2.10 - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@11.1.0': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@11.1.0': - optional: true - - '@petamoriken/float16@3.9.2': - optional: true - '@pkgjs/parseargs@0.11.0': optional: true @@ -13339,25 +14355,25 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@redis/bloom@5.5.5(@redis/client@5.5.5)': + '@redis/bloom@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.5.5 + '@redis/client': 5.5.6 - '@redis/client@5.5.5': + '@redis/client@5.5.6': dependencies: cluster-key-slot: 1.1.2 - '@redis/json@5.5.5(@redis/client@5.5.5)': + '@redis/json@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.5.5 + '@redis/client': 5.5.6 - '@redis/search@5.5.5(@redis/client@5.5.5)': + '@redis/search@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.5.5 + '@redis/client': 5.5.6 - '@redis/time-series@5.5.5(@redis/client@5.5.5)': + '@redis/time-series@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.5.5 + '@redis/client': 5.5.6 '@rollup/pluginutils@5.1.4(rollup@4.40.2)': dependencies: @@ -13486,6 +14502,20 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/abort-controller@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.0.0': + dependencies: + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/config-resolver@4.1.3': dependencies: '@smithy/node-config-provider': 4.1.2 @@ -13494,6 +14524,14 @@ snapshots: '@smithy/util-middleware': 4.0.3 tslib: 2.8.1 + '@smithy/config-resolver@4.1.4': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + '@smithy/core@3.4.0': dependencies: '@smithy/middleware-serde': 4.0.6 @@ -13505,6 +14543,18 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/core@3.5.1': + dependencies: + '@smithy/middleware-serde': 4.0.8 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.0.5': dependencies: '@smithy/node-config-provider': 4.1.2 @@ -13513,6 +14563,14 @@ snapshots: '@smithy/url-parser': 4.0.3 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.0.6': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + tslib: 2.8.1 + '@smithy/eventstream-codec@2.2.0': dependencies: '@aws-crypto/crc32': 3.0.0 @@ -13523,7 +14581,14 @@ snapshots: '@smithy/eventstream-codec@4.0.3': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.0 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.0.4': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 @@ -13533,11 +14598,22 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/eventstream-serde-browser@4.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/eventstream-serde-config-resolver@4.1.1': dependencies: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/eventstream-serde-config-resolver@4.1.2': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/eventstream-serde-node@2.2.0': dependencies: '@smithy/eventstream-serde-universal': 2.2.0 @@ -13550,6 +14626,12 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/eventstream-serde-node@4.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/eventstream-serde-universal@2.2.0': dependencies: '@smithy/eventstream-codec': 2.2.0 @@ -13562,6 +14644,12 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/eventstream-serde-universal@4.0.4': + dependencies: + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/fetch-http-handler@2.5.0': dependencies: '@smithy/protocol-http': 3.3.0 @@ -13578,6 +14666,21 @@ snapshots: '@smithy/util-base64': 4.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.0.4': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.0.4': + dependencies: + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/hash-node@4.0.3': dependencies: '@smithy/types': 4.3.0 @@ -13585,11 +14688,29 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/hash-node@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/invalid-dependency@4.0.3': dependencies: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/invalid-dependency@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 @@ -13602,12 +14723,24 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/md5-js@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/middleware-content-length@4.0.3': dependencies: '@smithy/protocol-http': 5.1.1 '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/middleware-content-length@4.0.4': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/middleware-endpoint@2.5.1': dependencies: '@smithy/middleware-serde': 2.3.0 @@ -13629,6 +14762,29 @@ snapshots: '@smithy/util-middleware': 4.0.3 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.1.9': + dependencies: + '@smithy/core': 3.5.1 + '@smithy/middleware-serde': 4.0.8 + '@smithy/node-config-provider': 4.1.3 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-middleware': 4.0.4 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.1.10': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/service-error-classification': 4.0.5 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 + tslib: 2.8.1 + uuid: 9.0.1 + '@smithy/middleware-retry@4.1.8': dependencies: '@smithy/node-config-provider': 4.1.2 @@ -13652,6 +14808,12 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/middleware-serde@4.0.8': + dependencies: + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/middleware-stack@2.2.0': dependencies: '@smithy/types': 2.12.0 @@ -13662,6 +14824,11 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/middleware-stack@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/node-config-provider@2.3.0': dependencies: '@smithy/property-provider': 2.2.0 @@ -13676,6 +14843,13 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/node-config-provider@4.1.3': + dependencies: + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/node-http-handler@2.5.0': dependencies: '@smithy/abort-controller': 2.2.0 @@ -13692,6 +14866,14 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.0.6': + dependencies: + '@smithy/abort-controller': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/property-provider@2.2.0': dependencies: '@smithy/types': 2.12.0 @@ -13702,6 +14884,11 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/property-provider@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/protocol-http@3.3.0': dependencies: '@smithy/types': 2.12.0 @@ -13712,6 +14899,11 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/protocol-http@5.1.2': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/querystring-builder@2.2.0': dependencies: '@smithy/types': 2.12.0 @@ -13724,6 +14916,12 @@ snapshots: '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + '@smithy/querystring-parser@2.2.0': dependencies: '@smithy/types': 2.12.0 @@ -13734,10 +14932,19 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/querystring-parser@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/service-error-classification@4.0.4': dependencies: '@smithy/types': 4.3.0 + '@smithy/service-error-classification@4.0.5': + dependencies: + '@smithy/types': 4.3.1 + '@smithy/shared-ini-file-loader@2.4.0': dependencies: '@smithy/types': 2.12.0 @@ -13748,6 +14955,11 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/signature-v4@3.1.2': dependencies: '@smithy/is-array-buffer': 3.0.0 @@ -13769,6 +14981,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.1.2': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/smithy-client@2.5.1': dependencies: '@smithy/middleware-endpoint': 2.5.1 @@ -13788,6 +15011,16 @@ snapshots: '@smithy/util-stream': 4.2.1 tslib: 2.8.1 + '@smithy/smithy-client@4.4.1': + dependencies: + '@smithy/core': 3.5.1 + '@smithy/middleware-endpoint': 4.1.9 + '@smithy/middleware-stack': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 + tslib: 2.8.1 + '@smithy/types@2.12.0': dependencies: tslib: 2.8.1 @@ -13800,6 +15033,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/types@4.3.1': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@2.2.0': dependencies: '@smithy/querystring-parser': 2.2.0 @@ -13812,6 +15049,12 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/url-parser@4.0.4': + dependencies: + '@smithy/querystring-parser': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/util-base64@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 @@ -13859,6 +15102,14 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.0.17': + dependencies: + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + bowser: 2.11.0 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.0.15': dependencies: '@smithy/config-resolver': 4.1.3 @@ -13869,12 +15120,28 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.0.17': + dependencies: + '@smithy/config-resolver': 4.1.4 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.1 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/util-endpoints@3.0.5': dependencies: '@smithy/node-config-provider': 4.1.2 '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/util-endpoints@3.0.6': + dependencies: + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/util-hex-encoding@2.2.0': dependencies: tslib: 2.8.1 @@ -13902,12 +15169,23 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/util-middleware@4.0.4': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/util-retry@4.0.4': dependencies: '@smithy/service-error-classification': 4.0.4 '@smithy/types': 4.3.0 tslib: 2.8.1 + '@smithy/util-retry@4.0.5': + dependencies: + '@smithy/service-error-classification': 4.0.5 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@smithy/util-stream@2.2.0': dependencies: '@smithy/fetch-http-handler': 2.5.0 @@ -13930,6 +15208,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/util-stream@4.2.2': + dependencies: + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@2.2.0': dependencies: tslib: 2.8.1 @@ -13957,118 +15246,124 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 + '@smithy/util-waiter@4.0.5': + dependencies: + '@smithy/abort-controller': 4.0.4 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@standard-schema/utils@0.3.0': {} - '@storybook/addon-actions@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-actions@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) uuid: 9.0.1 - '@storybook/addon-backgrounds@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-backgrounds@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-controls@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-docs@8.6.12(@types/react@18.3.23)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.23)(react@18.3.1) - '@storybook/blocks': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/csf-plugin': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/blocks': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': - dependencies: - '@storybook/addon-actions': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-backgrounds': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-controls': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-docs': 8.6.12(@types/react@18.3.23)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-highlight': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-measure': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-outline': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-toolbars': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-viewport': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + '@storybook/addon-essentials@8.6.12(@types/react@18.3.23)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@storybook/addon-actions': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-backgrounds': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-controls': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-docs': 8.6.12(@types/react@18.3.23)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-highlight': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-measure': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-outline': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-toolbars': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-viewport': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-highlight@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/addon-measure@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-measure@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-outline@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-outline@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-toolbars@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-toolbars@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/addon-viewport@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-viewport@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/blocks@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/blocks@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@storybook/builder-vite@9.0.8(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@storybook/csf-plugin': 9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + '@storybook/csf-plugin': 9.0.8(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) ts-dedent: 2.2.0 vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - '@storybook/components@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/components@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/core-events@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/core-events@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/csf-plugin@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/csf-plugin@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf-plugin@9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/csf-plugin@9.0.8(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -14078,35 +15373,35 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/manager-api@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/manager-api@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/react-dom-shim@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/react-dom-shim@8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/react-dom-shim@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/react-dom-shim@9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) - '@storybook/react-vite@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@storybook/react-vite@9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.2)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.0(typescript@5.8.3)(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@storybook/builder-vite': 9.0.5(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) - '@storybook/react': 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-vite': 9.0.8(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + '@storybook/react': 9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 react-docgen: 8.0.0 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) tsconfig-paths: 4.2.0 vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: @@ -14114,19 +15409,19 @@ snapshots: - supports-color - typescript - '@storybook/react@9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/react-dom-shim': 9.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 - '@storybook/theming@8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/theming@8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3))': dependencies: - storybook: 9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3) '@swc/counter@0.1.3': {} @@ -14287,22 +15582,22 @@ snapshots: '@tanstack/query-core@5.76.0': {} - '@tanstack/query-core@5.80.2': {} + '@tanstack/query-core@5.80.6': {} '@tanstack/react-query@5.76.1(react@18.3.1)': dependencies: '@tanstack/query-core': 5.76.0 react: 18.3.1 - '@tanstack/react-query@5.80.2(react@18.3.1)': + '@tanstack/react-query@5.80.6(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.80.2 + '@tanstack/query-core': 5.80.6 react: 18.3.1 '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.27.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -14334,6 +15629,22 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 + '@tne/tne-agent-v2@file:packages/tne-tne-agent-v2-0.0.1.j.tgz(@types/node@20.17.50)(ws@8.18.2)(zod@3.24.4)': + dependencies: + '@aws-sdk/client-s3': 3.823.0 + '@graphai/agents': 0.2.10(@types/node@20.17.50)(ws@8.18.2)(zod@3.24.4) + '@graphai/vanilla': 0.2.15 + buffer: 6.0.3 + uuid: 11.1.0 + yaml: 2.8.0 + transitivePeerDependencies: + - '@types/node' + - aws-crt + - debug + - encoding + - ws + - zod + '@tootallnate/once@2.0.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -14592,9 +15903,9 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@20.17.57': + '@types/node@20.19.0': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 '@types/node@22.15.20': dependencies: @@ -14654,6 +15965,10 @@ snapshots: '@types/vscode@1.100.0': {} '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.0 + + '@types/xml2js@0.4.14': dependencies: '@types/node': 22.15.29 @@ -14788,11 +16103,11 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/expect@3.2.1': + '@vitest/expect@3.2.2': dependencies: '@types/chai': 5.2.2 - '@vitest/spy': 3.2.1 - '@vitest/utils': 3.2.1 + '@vitest/spy': 3.2.2 + '@vitest/utils': 3.2.2 chai: 5.2.0 tinyrainbow: 2.0.0 @@ -14820,9 +16135,9 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.2.1(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.2(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.2.1 + '@vitest/spy': 3.2.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -14840,7 +16155,7 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.2.1': + '@vitest/pretty-format@3.2.2': dependencies: tinyrainbow: 2.0.0 @@ -14854,9 +16169,9 @@ snapshots: '@vitest/utils': 3.2.0 pathe: 2.0.3 - '@vitest/runner@3.2.1': + '@vitest/runner@3.2.2': dependencies: - '@vitest/utils': 3.2.1 + '@vitest/utils': 3.2.2 pathe: 2.0.3 '@vitest/snapshot@3.1.3': @@ -14871,9 +16186,9 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/snapshot@3.2.1': + '@vitest/snapshot@3.2.2': dependencies: - '@vitest/pretty-format': 3.2.1 + '@vitest/pretty-format': 3.2.2 magic-string: 0.30.17 pathe: 2.0.3 @@ -14889,7 +16204,7 @@ snapshots: dependencies: tinyspy: 4.0.3 - '@vitest/spy@3.2.1': + '@vitest/spy@3.2.2': dependencies: tinyspy: 4.0.3 @@ -14911,9 +16226,9 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@vitest/utils@3.2.1': + '@vitest/utils@3.2.2': dependencies: - '@vitest/pretty-format': 3.2.1 + '@vitest/pretty-format': 3.2.2 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -15068,6 +16383,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -15259,7 +16581,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.27.4 cosmiconfig: 7.1.0 resolve: 1.22.10 optional: true @@ -15412,6 +16734,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 @@ -15464,6 +16791,8 @@ snapshots: camelcase-css@2.0.1: {} + camelcase@4.1.0: {} + camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -15604,6 +16933,8 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cli-width@4.1.0: {} + client-only@0.0.1: {} cliui@7.0.4: @@ -16237,17 +17568,16 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7): + drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7): optionalDependencies: '@libsql/client': 0.15.8 better-sqlite3: 11.10.0 - gel: 2.1.0 postgres: 3.4.7 - drizzle-zod@0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7))(zod@3.25.49): + drizzle-zod@0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7))(zod@3.25.56): dependencies: - drizzle-orm: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7) - zod: 3.25.49 + drizzle-orm: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(postgres@3.4.7) + zod: 3.25.56 duck@0.1.12: dependencies: @@ -16339,9 +17669,6 @@ snapshots: entities@6.0.0: {} - env-paths@3.0.0: - optional: true - environment@1.1.0: {} error-ex@1.3.2: @@ -16649,48 +17976,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.28.0(jiti@2.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.14.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.28.0 - '@eslint/plugin-kit': 0.3.1 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.4.2 - transitivePeerDependencies: - - supports-color - espree@10.3.0: dependencies: acorn: 8.14.1 @@ -16742,6 +18027,9 @@ snapshots: eventemitter3@5.0.1: {} + events@3.3.0: + optional: true + eventsource-parser@3.0.2: {} eventsource@3.0.7: @@ -16904,11 +18192,13 @@ snapshots: fast-shallow-equal@1.0.0: {} + fast-uri@3.0.6: {} + fast-xml-parser@4.4.1: dependencies: strnum: 1.1.2 - fast-xml-parser@5.2.3: + fast-xml-parser@5.2.5: dependencies: strnum: 2.1.1 @@ -16924,9 +18214,9 @@ snapshots: dependencies: bser: 2.1.1 - fd-package-json@2.0.0: + fd-package-json@1.2.0: dependencies: - walk-up-path: 4.0.0 + walk-up-path: 3.0.1 fd-slicer@1.1.0: dependencies: @@ -17021,9 +18311,9 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - formatly@0.2.4: + formatly@0.2.3: dependencies: - fd-package-json: 2.0.0 + fd-package-json: 1.2.0 formdata-node@4.4.1: dependencies: @@ -17119,18 +18409,6 @@ snapshots: - encoding - supports-color - gel@2.1.0: - dependencies: - '@petamoriken/float16': 3.9.2 - debug: 4.4.1(supports-color@8.1.1) - env-paths: 3.0.0 - semver: 7.7.2 - shell-quote: 1.8.3 - which: 4.0.0 - transitivePeerDependencies: - - supports-color - optional: true - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -17269,8 +18547,34 @@ snapshots: graceful-fs@4.2.11: {} + graphai@2.0.5: {} + graphemer@1.4.0: {} + groq-sdk@0.14.0: + dependencies: + '@types/node': 18.19.100 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + groq-sdk@0.22.0: + dependencies: + '@types/node': 18.19.100 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + gtoken@7.1.0: dependencies: gaxios: 6.7.1 @@ -17503,6 +18807,10 @@ snapshots: once: 1.4.0 wrappy: 1.0.2 + infobox-parser@3.6.4: + dependencies: + camelcase: 4.1.0 + inherits@2.0.4: {} ini@1.3.8: {} @@ -18312,6 +19620,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json-stringify-safe@5.0.1: {} @@ -18393,23 +19703,23 @@ snapshots: kleur@3.0.3: {} - knip@5.60.0(@types/node@22.15.29)(typescript@5.8.3): + knip@5.55.1(@types/node@22.15.29)(typescript@5.8.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 22.15.29 + enhanced-resolve: 5.18.1 fast-glob: 3.3.3 - formatly: 0.2.4 + formatly: 0.2.3 jiti: 2.4.2 js-yaml: 4.1.0 minimist: 1.2.8 - oxc-resolver: 11.1.0 picocolors: 1.1.1 picomatch: 4.0.2 smol-toml: 1.3.4 - strip-json-comments: 5.0.2 + strip-json-comments: 5.0.1 typescript: 5.8.3 - zod: 3.25.51 - zod-validation-error: 3.4.1(zod@3.25.51) + zod: 3.24.4 + zod-validation-error: 3.4.1(zod@3.24.4) knuth-shuffle-seeded@1.0.6: dependencies: @@ -19261,6 +20571,8 @@ snapshots: mute-stream@0.0.8: {} + mute-stream@2.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -19561,22 +20873,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-resolver@11.1.0: - optionalDependencies: - '@oxc-resolver/binding-darwin-arm64': 11.1.0 - '@oxc-resolver/binding-darwin-x64': 11.1.0 - '@oxc-resolver/binding-freebsd-x64': 11.1.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.1.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.1.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.1.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-x64-musl': 11.1.0 - '@oxc-resolver/binding-wasm32-wasi': 11.1.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.1.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.1.0 - p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -19865,7 +21161,7 @@ snapshots: preact: 10.26.6 web-vitals: 4.2.4 - posthog-js@1.249.2: + posthog-js@1.249.4: dependencies: core-js: 3.42.0 fflate: 0.4.8 @@ -19921,6 +21217,9 @@ snapshots: process-nextick-args@2.0.1: {} + process@0.11.10: + optional: true + progress@2.0.3: {} promise-limit@2.7.0: {} @@ -20247,6 +21546,15 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + optional: true + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -20285,13 +21593,13 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - redis@5.5.5: + redis@5.5.6: dependencies: - '@redis/bloom': 5.5.5(@redis/client@5.5.5) - '@redis/client': 5.5.5 - '@redis/json': 5.5.5(@redis/client@5.5.5) - '@redis/search': 5.5.5(@redis/client@5.5.5) - '@redis/time-series': 5.5.5(@redis/client@5.5.5) + '@redis/bloom': 5.5.6(@redis/client@5.5.6) + '@redis/client': 5.5.6 + '@redis/json': 5.5.6(@redis/client@5.5.6) + '@redis/search': 5.5.6(@redis/client@5.5.6) + '@redis/time-series': 5.5.6(@redis/client@5.5.6) reflect.getprototypeof@1.0.10: dependencies: @@ -20382,8 +21690,14 @@ snapshots: remove-markdown@0.6.2: {} + replicate@1.0.1: + optionalDependencies: + readable-stream: 4.7.0 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + requires-port@1.0.0: {} resize-observer-polyfill@1.5.1: {} @@ -20638,9 +21952,6 @@ snapshots: shell-quote@1.8.2: {} - shell-quote@1.8.3: - optional: true - shiki@3.4.1: dependencies: '@shikijs/core': 3.4.1 @@ -20815,14 +22126,14 @@ snapshots: stdin-discarder@0.2.2: {} - storybook-dark-mode@4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)): + storybook-dark-mode@4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)): dependencies: - '@storybook/components': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/core-events': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/components': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/core-events': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) '@storybook/global': 5.0.0 '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/manager-api': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/theming': 8.6.12(storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/manager-api': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/theming': 8.6.12(storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3)) fast-deep-equal: 3.1.3 memoizerific: 1.11.3 transitivePeerDependencies: @@ -20830,7 +22141,7 @@ snapshots: - react-dom - storybook - storybook@9.0.5(@testing-library/dom@10.4.0)(prettier@3.5.3): + storybook@9.0.8(@testing-library/dom@10.4.0)(prettier@3.5.3): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.3 @@ -20984,7 +22295,7 @@ snapshots: strip-json-comments@3.1.1: {} - strip-json-comments@5.0.2: {} + strip-json-comments@5.0.1: {} strnum@1.1.2: {} @@ -21768,7 +23079,7 @@ snapshots: - tsx - yaml - vite-node@3.2.1(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) @@ -21978,16 +23289,16 @@ snapshots: - tsx - yaml - vitest@3.2.1(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 3.2.1 - '@vitest/mocker': 3.2.1(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.1 - '@vitest/runner': 3.2.1 - '@vitest/snapshot': 3.2.1 - '@vitest/spy': 3.2.1 - '@vitest/utils': 3.2.1 + '@vitest/expect': 3.2.2 + '@vitest/mocker': 3.2.2(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.2 + '@vitest/runner': 3.2.2 + '@vitest/snapshot': 3.2.2 + '@vitest/spy': 3.2.2 + '@vitest/utils': 3.2.2 chai: 5.2.0 debug: 4.4.1(supports-color@8.1.1) expect-type: 1.2.1 @@ -22001,7 +23312,7 @@ snapshots: tinypool: 1.1.0 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.1(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -22051,7 +23362,7 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - walk-up-path@4.0.0: {} + walk-up-path@3.0.1: {} walker@1.0.8: dependencies: @@ -22167,6 +23478,13 @@ snapshots: dependencies: string-width: 4.2.3 + wikipedia@2.1.2: + dependencies: + axios: 1.9.0 + infobox-parser: 3.6.4 + transitivePeerDependencies: + - debug + windows-release@6.1.0: dependencies: execa: 8.0.1 @@ -22177,6 +23495,12 @@ snapshots: workerpool@9.2.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -22211,6 +23535,11 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + xmlbuilder@10.1.1: {} xmlbuilder@11.0.1: {} @@ -22282,35 +23611,31 @@ snapshots: yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.2: {} + yoctocolors@2.1.1: {} zod-to-json-schema@3.24.5(zod@3.24.4): dependencies: zod: 3.24.4 - zod-to-json-schema@3.24.5(zod@3.25.49): + zod-to-json-schema@3.24.5(zod@3.25.56): dependencies: - zod: 3.25.49 - - zod-to-json-schema@3.24.5(zod@3.25.51): - dependencies: - zod: 3.25.51 + zod: 3.25.56 zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.24.4): dependencies: typescript: 5.8.3 zod: 3.24.4 - zod-validation-error@3.4.1(zod@3.25.51): + zod-validation-error@3.4.1(zod@3.24.4): dependencies: - zod: 3.25.51 + zod: 3.24.4 zod@3.23.8: {} zod@3.24.4: {} - zod@3.25.49: {} - - zod@3.25.51: {} + zod@3.25.56: {} zwitch@2.0.4: {} diff --git a/sample-flows/Chat.yaml b/sample-flows/Chat.yaml new file mode 100644 index 0000000000..c9b62ca710 --- /dev/null +++ b/sample-flows/Chat.yaml @@ -0,0 +1,9 @@ +version: 0.5 +nodes: + chatHistory: + value: [] + llm: + agent: openAIAgent + inputs: + messages: ":chatHistory" + isResult: true diff --git a/sample-flows/SafeAi.yaml b/sample-flows/SafeAi.yaml new file mode 100644 index 0000000000..0f2d4d7ffd --- /dev/null +++ b/sample-flows/SafeAi.yaml @@ -0,0 +1,151 @@ +version: 0.5 +nodes: + chatHistory: + value: [] + + llmEngine: + value: "" + + modelDispatcher: + agent: ":llmEngine" + inputs: + messages: ":chatHistory" + system: + - >- + You are a LLM model dispatcher that routes the user request to the appropriate LLM, based off of user sentiment and the complexity of the request. Classify the user query into one of `small`, `medium`, and `large` based off of both the complexity of question they're asking (queries that require complex reasoning are `large`, and queries that do not require much thinking are `small`. If the chat history indicates that the user is unsatisfied with the LLM performance, use this in your thinking and consider weighting towards `large` in these cases to give the user a better experience. Using the provided mappings, fill the JSON schema with the corresponding model name and base URL. + - "small - model_name: llama3.2:3b baseUrl: http://127.0.0.1:11434/v1" + - "medium - model_name: gpt-4o baseUrl: https://api.openai.com/v1" + - "large - model_name: o1 baseUrl: https://api.openai.com/v1" + response_format: + type: json_schema + json_schema: + name: model_information + schema: + type: object + properties: + model: + type: string + baseUrl: + type: string + required: ["model", "baseUrl"] + additionalProperties: false + strict: true + + modelDetails: + agent: jsonParserAgent + inputs: + text: ":modelDispatcher.text" + console: true + + llm: + agent: ":llmEngine" + inputs: + messages: ":chatHistory" + params: + model: ":modelDetails.model" + baseURL: ":modelDetails.baseUrl" + console: true + isResult: true + + juryDispatcher: + agent: ":llmEngine" + inputs: + messages: ":chatHistory" + system: + - >- + Your job is to examine the chat history, user query, and any reasoning steps (chain-of-thought, code, etc.) that are given to you, and output the correct models that should be use to assess their accuracy and validity. + - >- + Output one or more models that should be used to evaluate the results from the list below. + - >- + For example, if the user query or question involves math or mathematical calculations, include the `math` model in your output. + - >- + For complex retrieval or reasoning, include `reasoning`, `code` for code analysis, and so on and so forth. + - "pop-culture - model_name: gpt-4o-mini baseUrl: https://api.openai.com/v1" + - "math - model_name: o1 baseUrl: https://api.openai.com/v1" + - "reasoning - model_name: o3-mini baseUrl: https://api.openai.com/v1" + - "code - model_name: o3-mini baseUrl: https://api.openai.com/v1" + - "ANSWER TO EVALUATE\n\n" + - ":llm.text" + response_format: + type: json_schema + json_schema: + name: model_information + schema: + type: object + properties: + models: + type: array + items: + type: object + properties: + model: + type: string + baseUrl: + type: string + domain: + type: string + required: ["model", "baseUrl", "domain"] + additionalProperties: false + required: ["models"] + additionalProperties: false + strict: true + + juryDetails: + agent: jsonParserAgent + inputs: + text: ":juryDispatcher.text" + console: true + + juryEvaluation: + agent: nestedAgent + inputs: + llmEngine: ":llmEngine" + juryModels: ":juryDetails.models" + llm: ":llm" + graph: + version: 0.5 + loop: + while: ":juryModels" + nodes: + juryModels: + value: [] + update: ":shift.array" + results: + value: [] + update: ":reducer.array" + isResult: true + shift: + agent: shiftAgent + inputs: + array: ":juryModels" + jurist: + agent: ":llmEngine" + inputs: + prompt: ":llm.text" + system: >- + You are an expert in ${:shift.item.domain}. Using your expertise, grade the given input for accuracy and correctness on a scale of 1-10 and explain your reasoning. In your response, state your domain of expertise. + params: + model: ":shift.item.model" + baseURL: ":shift.item.baseUrl" + reducer: + agent: pushAgent + inputs: + array: ":results" + item: ":jurist.text" + + extractResults: + agent: arrayJoinAgent + inputs: + array: ":juryEvaluation.results" + params: + separator: "\n\n" + console: true + isResult: true + + generateReport: + agent: ":llmEngine" + inputs: + prompt: ":extractResults.text" + system: >- + Given the list of accuracy evaluations, generate a report complete with a descriptive title, headings, and display the contents of the report to the user. + isResult: true diff --git a/sample-flows/Weather.yaml b/sample-flows/Weather.yaml new file mode 100644 index 0000000000..464541a673 --- /dev/null +++ b/sample-flows/Weather.yaml @@ -0,0 +1,76 @@ +version: 0.5 +nodes: + userPrompt: + value: "" + + llmEngine: + value: "openAIAgent" + + fetchAPI: + agent: ":llmEngine" + inputs: + prompt: ":userPrompt" + system: >- + You are capable of either returning True or False. Return True if the user is asking for information which would require external knowledge, and False otherwise. + + checkAPICallNeeded: + agent: compareAgent + inputs: + array: [":fetchAPI.text", "!=", "False"] + + conversationLLM: + agent: ":llmEngine" + inputs: + system: You are a helpful chat assistant. + prompt: ":userPrompt" + unless: ":checkAPICallNeeded" + isResult: true + + document: + agent: fetchAgent + console: + before: "...fetching document" + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/main/packages/graphai/README.md + + sampleGraph: + agent: fetchAgent + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/refs/heads/main/packages/samples/src/net/weather.ts + + graphGenerator: + agent: ":llmEngine" + if: ":checkAPICallNeeded" + inputs: + prompt: ":userPrompt" + system: + - >- + You an expert in GraphAI programming. You are responsible in generating a graphAI graph to answer the user question. Always store the results in a node called 'output', with isResult set to true. + - "graphAI graph outputs in json format" + - "[documentation of GraphAI]\n${:document}" + - "[sample graph]\n```json\n${:sampleGraph}\n```" + - "For weather, directly input the latitude/longitude into the GraphAI graph you write" + params: + temperature: 0 + isResult: true + + execute: + if: ":checkAPICallNeeded" + agent: nestedAgent + graph: ":graphGenerator.text.codeBlock().jsonParse()" + + summarize: + agent: ":llmEngine" + if: ":checkAPICallNeeded" + inputs: + prompt: ":userPrompt" + system: + - "Output to summarize:\n\n" + - ":execute.output" + - "Instructions\n\n" + - "Succinctly summarize the data you've received to answer the user question in the chat history." + isResult: true diff --git a/sample-flows/Whiskey.yaml b/sample-flows/Whiskey.yaml new file mode 100644 index 0000000000..191ec6fe95 --- /dev/null +++ b/sample-flows/Whiskey.yaml @@ -0,0 +1,68 @@ +version: 0.5 +nodes: + imageData1: + agent: s3FileAgent + params: + fileName: image input 1.jpg + bucket: bp-authoring-files + region: us-west-2 + uid: "london-demo-1-13" + inputs: {} + imageData2: + agent: s3FileAgent + params: + fileName: image input 2.jpg + bucket: bp-authoring-files + region: us-west-2 + uid: "london-demo-1-13" + inputs: {} + imageData3: + agent: s3FileAgent + params: + fileName: image input 3.jpg + bucket: bp-authoring-files + region: us-west-2 + uid: "london-demo-1-13" + inputs: {} + imageExtractor: + agent: mapAgent + inputs: + rows: + - ":imageData1.imageData" + - ":imageData2.imageData" + - ":imageData3.imageData" + params: {} + graph: + version: 0.5 + nodes: + imageExtraction: + agent: openAIAgent + inputs: + messages: + - role: user + content: + - type: image_url + image_url: + url: "${:row}" + system: From the given image(s), extract the tabular data in a CSV format. + console: true + filterExtraction: + agent: copyAgent + inputs: + text: ":imageExtraction.text" + params: + namedKey: text + isResult: true + console: true + aggregateImageExtraction: + agent: jsonParserAgent + inputs: + data: ":imageExtractor" + console: true + synthesizeLlm: + agent: openAIAgent + inputs: + prompt: ":aggregateImageExtraction.text" + system: From the given list, synthesize all tabular data into one or more tables + isResult: true + console: true diff --git a/src/assets/icons/icon-activitybar.svg b/src/assets/icons/icon-activitybar.svg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/assets/icons/icon-large.png b/src/assets/icons/icon-large.png new file mode 100644 index 0000000000..61141e6f00 Binary files /dev/null and b/src/assets/icons/icon-large.png differ diff --git a/src/assets/icons/icon-large.svg b/src/assets/icons/icon-large.svg new file mode 100644 index 0000000000..a1b43481ef --- /dev/null +++ b/src/assets/icons/icon-large.svg @@ -0,0 +1,19 @@ + + + + + + + TNE + + + + diff --git a/src/assets/icons/icon.png b/src/assets/icons/icon.png index b0bef29cc9..f1b443c2c7 100644 Binary files a/src/assets/icons/icon.png and b/src/assets/icons/icon.png differ diff --git a/src/assets/icons/icon.svg b/src/assets/icons/icon.svg index a4e2d75e5b..c45f33e13d 100644 --- a/src/assets/icons/icon.svg +++ b/src/assets/icons/icon.svg @@ -1,12 +1,19 @@ - - + - + + + TNE + + + diff --git a/src/assets/images/roo-logo.svg b/src/assets/images/roo-logo.svg index d2af8edd7a..eec91a3480 100644 --- a/src/assets/images/roo-logo.svg +++ b/src/assets/images/roo-logo.svg @@ -1,3 +1,19 @@ - - + + + + + + + TNE + + + diff --git a/src/assets/images/tne-logo-alt.svg b/src/assets/images/tne-logo-alt.svg new file mode 100644 index 0000000000..90ed60bb03 --- /dev/null +++ b/src/assets/images/tne-logo-alt.svg @@ -0,0 +1,21 @@ + + + + + + + TNE + + + + + + diff --git a/src/assets/images/tne-logo.svg b/src/assets/images/tne-logo.svg new file mode 100644 index 0000000000..eec91a3480 --- /dev/null +++ b/src/assets/images/tne-logo.svg @@ -0,0 +1,19 @@ + + + + + + + TNE + + + + diff --git a/src/core/assistant-message/presentAssistantMessage.ts b/src/core/assistant-message/presentAssistantMessage.ts index 3716906a8d..bcfaaa966c 100644 --- a/src/core/assistant-message/presentAssistantMessage.ts +++ b/src/core/assistant-message/presentAssistantMessage.ts @@ -18,6 +18,7 @@ import { listCodeDefinitionNamesTool } from "../tools/listCodeDefinitionNamesToo import { searchFilesTool } from "../tools/searchFilesTool" import { browserActionTool } from "../tools/browserActionTool" import { executeCommandTool } from "../tools/executeCommandTool" +import { runGraphaiTool } from "../tools/runGraphaiTool" import { useMcpToolTool } from "../tools/useMcpToolTool" import { accessMcpResourceTool } from "../tools/accessMcpResourceTool" import { askFollowupQuestionTool } from "../tools/askFollowupQuestionTool" @@ -186,6 +187,8 @@ export async function presentAssistantMessage(cline: Task) { return `[${block.name} to '${block.params.mode_slug}'${block.params.reason ? ` because: ${block.params.reason}` : ""}]` case "codebase_search": // Add case for the new tool return `[${block.name} for '${block.params.query}']` + case "run_graphai": + return `[${block.name} for '${block.params.path}']` case "new_task": { const mode = block.params.mode ?? defaultModeSlug const message = block.params.message ?? "(no message)" @@ -425,6 +428,9 @@ export async function presentAssistantMessage(cline: Task) { case "execute_command": await executeCommandTool(cline, block, askApproval, handleError, pushToolResult, removeClosingTag) break + case "run_graphai": + await runGraphaiTool(cline, block, askApproval, handleError, pushToolResult, removeClosingTag) + break case "use_mcp_tool": await useMcpToolTool(cline, block, askApproval, handleError, pushToolResult, removeClosingTag) break diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 8f93b0353d..6d6aa1e2ad 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SYSTEM_PROMPT should exclude diff strategy tool description when diffEnabled is false 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -294,6 +294,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -495,7 +523,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should exclude diff strategy tool description when diffEnabled is undefined 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -788,6 +816,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -989,7 +1045,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should explicitly handle undefined mcpHub 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -1282,6 +1338,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -1483,7 +1567,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should handle different browser viewport sizes 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -1829,6 +1913,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -2033,7 +2145,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include MCP server info when mcpHub is provided 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -2326,6 +2438,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## use_mcp_tool Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters. Parameters: @@ -2595,7 +2735,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include browser actions when supportsComputerUse is true 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -2941,6 +3081,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -3145,7 +3313,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include diff strategy tool description when diffEnabled is true 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -3526,6 +3694,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -3727,7 +3923,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should maintain consistent system prompt 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -4020,6 +4216,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -4263,7 +4487,7 @@ Mock generic rules" `; exports[`addCustomInstructions should exclude MCP server creation info when disabled 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -4556,6 +4780,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## use_mcp_tool Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters. Parameters: @@ -4834,7 +5086,7 @@ Mock generic rules" `; exports[`addCustomInstructions should generate correct prompt for architect mode 1`] = ` -"You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution. +"You are TNE-Code, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution. ==== @@ -5319,7 +5571,7 @@ Mock generic rules" `; exports[`addCustomInstructions should generate correct prompt for ask mode 1`] = ` -"You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics. +"You are TNE-Code, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics. ==== @@ -5721,7 +5973,7 @@ Mock generic rules" `; exports[`addCustomInstructions should include MCP server creation info when enabled 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -6014,6 +6266,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## use_mcp_tool Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters. Parameters: @@ -6301,7 +6581,7 @@ Mock generic rules" `; exports[`addCustomInstructions should include partial read instructions when partialReadsEnabled is true 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -6599,6 +6879,34 @@ Example: Requesting to execute ls in a specific directory if directed /home/user/projects +## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: diff --git a/src/core/prompts/instructions/create-mode.ts b/src/core/prompts/instructions/create-mode.ts index 47e998ff4c..b52144b866 100644 --- a/src/core/prompts/instructions/create-mode.ts +++ b/src/core/prompts/instructions/create-mode.ts @@ -37,7 +37,7 @@ customModes: - slug: designer # Required: unique slug with lowercase letters, numbers, and hyphens name: Designer # Required: mode display name roleDefinition: >- - You are Roo, a UI/UX expert specializing in design systems and frontend development. Your expertise includes: + You are TNE-Code, a UI/UX expert specializing in design systems and frontend development. Your expertise includes: - Creating and maintaining design systems - Implementing responsive and accessible web interfaces - Working with CSS, HTML, and modern frontend frameworks diff --git a/src/core/prompts/sections/index.ts b/src/core/prompts/sections/index.ts index d06dbbfde1..9f56164e89 100644 --- a/src/core/prompts/sections/index.ts +++ b/src/core/prompts/sections/index.ts @@ -8,3 +8,4 @@ export { getToolUseGuidelinesSection } from "./tool-use-guidelines" export { getCapabilitiesSection } from "./capabilities" export { getModesSection } from "./modes" export { markdownFormattingSection } from "./markdown-formatting" +export { getMemoryBankStrategySection } from "./memory-bank-strategy" diff --git a/src/core/prompts/sections/memory-bank-strategy.ts b/src/core/prompts/sections/memory-bank-strategy.ts new file mode 100644 index 0000000000..aba7b5d700 --- /dev/null +++ b/src/core/prompts/sections/memory-bank-strategy.ts @@ -0,0 +1,248 @@ +export function getMemoryBankStrategySection(): string { + return ` +==== + +MEMORY BANK STRATEGY + +memory_bank_strategy: + initialization: | + + - **CHECK FOR MEMORY BANK:** + + + * First, check if the memory-bank/ directory exists. + + + . + false + + + * If memory-bank DOES exist, skip immediately to \`if_memory_bank_exists\`. + + if_no_memory_bank: | + 1. **Inform the User:** + "No Memory Bank was found. I recommend creating one to maintain project context. + 2. **Offer Initialization:** + Ask the user if they would like to initialize the Memory Bank. + 3. **Conditional Actions:** + * If the user declines: + + I need to proceed with the task without Memory Bank functionality. + + a. Inform the user that the Memory Bank will not be created. + b. Set the status to '[MEMORY BANK: INACTIVE]'. + c. Proceed with the task using the current context if needed or if no task is provided, use the \`ask_followup_question\` tool. + * If the user agrees: + + I need to create the \`memory-bank/\` directory and core files. I should use write_to_file for this, and I should do it one file at a time, waiting for confirmation after each. The initial content for each file is defined below. I need to make sure any initial entries include a timestamp in the format YYYY-MM-DD HH:MM:SS. + + 4. **Check for \`projectBrief.md\`:** + - Use list_files to check for \`projectBrief.md\` *before* offering to create the memory bank. + - If \`projectBrief.md\` exists: + * Read its contents *before* offering to create the memory bank. + - If no \`projectBrief.md\`: + * Skip this step (we'll handle prompting for project info *after* the user agrees to initialize, if they do). + + I need to add default content for the Memory Bank files. + + a. Create the \`memory-bank/\` directory. + b. Create \`memory-bank/productContext.md\` with \`initial_content\`. + c. Create \`memory-bank/activeContext.md\` with \`initial_content\`. + d. Create \`memory-bank/progress.md\` with \`initial_content\`. + e. Create \`memory-bank/decisionLog.md\` with \`initial_content\`. + f. Create \`memory-bank/systemPatterns.md\` with \`initial_content\`. + g. Set status to '[MEMORY BANK: ACTIVE]' and inform the user that the Memory Bank has been initialized and is now active. + h. Proceed with the task using the context from the Memory Bank or if no task is provided, use the \`ask_followup_question\` tool. + initial_content: + productContext.md: | + # Product Context + + This file provides a high-level overview of the project and the expected product that will be created. Initially it is based upon projectBrief.md (if provided) and all other available project-related information in the working directory. This file is intended to be updated as the project evolves, and should be used to inform all other modes of the project's goals and context. + YYYY-MM-DD HH:MM:SS - Log of updates made will be appended as footnotes to the end of this file. + + * + + ## Project Goal + + * + + ## Key Features + + * + + ## Overall Architecture + + * + activeContext.md: | + # Active Context + + This file tracks the project's current status, including recent changes, current goals, and open questions. + YYYY-MM-DD HH:MM:SS - Log of updates made. + + * + + ## Current Focus + + * + + ## Recent Changes + + * + + ## Open Questions/Issues + + * + + progress.md: | + # Progress + + This file tracks the project's progress using a task list format. + YYYY-MM-DD HH:MM:SS - Log of updates made. + + * + + ## Completed Tasks + + * + + ## Current Tasks + + * + + ## Next Steps + + * + decisionLog.md: | + # Decision Log + + This file records architectural and implementation decisions using a list format. + YYYY-MM-DD HH:MM:SS - Log of updates made. + + * + + ## Decision + + * + + ## Rationale + + * + + ## Implementation Details + + * + + systemPatterns.md: | + # System Patterns *Optional* + + This file documents recurring patterns and standards used in the project. + It is optional, but recommended to be updated as the project evolves. + YYYY-MM-DD HH:MM:SS - Log of updates made. + + * + + ## Coding Patterns + + * + + ## Architectural Patterns + + * + + ## Testing Patterns + + * + if_memory_bank_exists: | + **READ *ALL* MEMORY BANK FILES** + + I will read all memory bank files, one at a time. + + Plan: Read all mandatory files sequentially. + 1. Read \`productContext.md\` + 2. Read \`activeContext.md\` + 3. Read \`systemPatterns.md\` + 4. Read \`decisionLog.md\` + 5. Read \`progress.md\` + 6. Set status to [MEMORY BANK: ACTIVE] and inform user. + 7. Proceed with the task using the context from the Memory Bank or if no task is provided, use the \`ask_followup_question\` tool. + +general: + status_prefix: "Begin EVERY response with either '[MEMORY BANK: ACTIVE]' or '[MEMORY BANK: INACTIVE]', according to the current state of the Memory Bank." + +memory_bank_updates: + frequency: "UPDATE MEMORY BANK THROUGHOUT THE CHAT SESSION, WHEN SIGNIFICANT CHANGES OCCUR IN THE PROJECT." + decisionLog.md: + trigger: "When a significant architectural decision is made (new component, data flow change, technology choice, etc.). Use your judgment to determine significance." + action: | + + I need to update decisionLog.md with a decision, the rationale, and any implications. + Use insert_content to *append* new information. Never overwrite existing entries. Always include a timestamp. + + format: | + "[YYYY-MM-DD HH:MM:SS] - [Summary of Change/Focus/Issue]" + productContext.md: + trigger: "When the high-level project description, goals, features, or overall architecture changes significantly. Use your judgment to determine significance." + action: | + + A fundamental change has occurred which warrants an update to productContext.md. + Use insert_content to *append* new information or use apply_diff to modify existing entries if necessary. Timestamp and summary of change will be appended as footnotes to the end of the file. + + format: "(Optional)[YYYY-MM-DD HH:MM:SS] - [Summary of Change]" + systemPatterns.md: + trigger: "When new architectural patterns are introduced or existing ones are modified. Use your judgement." + action: | + + I need to update systemPatterns.md with a brief summary and time stamp. + Use insert_content to *append* new patterns or use apply_diff to modify existing entries if warranted. Always include a timestamp. + + format: "[YYYY-MM-DD HH:MM:SS] - [Description of Pattern/Change]" + activeContext.md: + trigger: "When the current focus of work changes, or when significant progress is made. Use your judgement." + action: | + + I need to update activeContext.md with a brief summary and time stamp. + Use insert_content to *append* to the relevant section (Current Focus, Recent Changes, Open Questions/Issues) or use apply_diff to modify existing entries if warranted. Always include a timestamp. + + format: "[YYYY-MM-DD HH:MM:SS] - [Summary of Change/Focus/Issue]" + progress.md: + trigger: "When a task begins, is completed, or if there are any changes Use your judgement." + action: | + + I need to update progress.md with a brief summary and time stamp. + Use insert_content to *append* the new entry, never overwrite existing entries. Always include a timestamp. + + format: "[YYYY-MM-DD HH:MM:SS] - [Summary of Change/Focus/Issue]" + +umb: + trigger: "^(Update Memory Bank|UMB)$" + instructions: + - "Halt Current Task: Stop current activity" + - "Acknowledge Command: '[MEMORY BANK: UPDATING]'" + - "Review Chat History" + user_acknowledgement_text: "[MEMORY BANK: UPDATING]" + core_update_process: | + 1. Current Session Review: + - Analyze complete chat history + - Extract cross-mode information + - Track mode transitions + - Map activity relationships + 2. Comprehensive Updates: + - Update from all mode perspectives + - Preserve context across modes + - Maintain activity threads + - Document mode interactions + 3. Memory Bank Synchronization: + - Update all affected *.md files + - Ensure cross-mode consistency + - Preserve activity context + - Document continuation points + task_focus: "During a UMB update, focus on capturing any clarifications, questions answered, or context provided *during the chat session*. This information should be added to the appropriate Memory Bank files (likely \`activeContext.md\` or \`decisionLog.md\`), using the other modes' update formats as a guide. *Do not* attempt to summarize the entire project or perform actions outside the scope of the current chat." + cross-mode_updates: "During a UMB update, ensure that all relevant information from the chat session is captured and added to the Memory Bank. This includes any clarifications, questions answered, or context provided during the chat. Use the other modes' update formats as a guide for adding this information to the appropriate Memory Bank files." + post_umb_actions: + - "Memory Bank fully synchronized" + - "All mode contexts preserved" + - "Session can be safely closed" + - "Next assistant will have complete context" + override_file_restrictions: true + override_mode_restrictions: true` +} diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 61fd9df81e..fafb0c8d3d 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -24,6 +24,7 @@ import { getModesSection, addCustomInstructions, markdownFormattingSection, + getMemoryBankStrategySection, } from "./sections" async function generatePrompt( @@ -99,6 +100,8 @@ ${getSystemInfoSection(cwd)} ${getObjectiveSection(codeIndexManager, experiments)} +${getMemoryBankStrategySection()} + ${await addCustomInstructions(baseInstructions, globalCustomInstructions || "", cwd, mode, { language: language ?? formatLanguage(vscode.env.language), rooIgnoreInstructions })}` return basePrompt diff --git a/src/core/prompts/tools/index.ts b/src/core/prompts/tools/index.ts index 736c716a27..89c0266087 100644 --- a/src/core/prompts/tools/index.ts +++ b/src/core/prompts/tools/index.ts @@ -15,6 +15,7 @@ import { getInsertContentDescription } from "./insert-content" import { getSearchAndReplaceDescription } from "./search-and-replace" import { getListCodeDefinitionNamesDescription } from "./list-code-definition-names" import { getBrowserActionDescription } from "./browser-action" +import { getRunGraphaiDescription } from "./run-graphai" import { getAskFollowupQuestionDescription } from "./ask-followup-question" import { getAttemptCompletionDescription } from "./attempt-completion" import { getUseMcpToolDescription } from "./use-mcp-tool" @@ -34,6 +35,7 @@ const toolDescriptionMap: Record string | undefined> list_files: (args) => getListFilesDescription(args), list_code_definition_names: (args) => getListCodeDefinitionNamesDescription(args), browser_action: (args) => getBrowserActionDescription(args), + run_graphai: (args) => getRunGraphaiDescription(args), ask_followup_question: () => getAskFollowupQuestionDescription(), attempt_completion: (args) => getAttemptCompletionDescription(args), use_mcp_tool: (args) => getUseMcpToolDescription(args), @@ -133,6 +135,7 @@ export { getListFilesDescription, getListCodeDefinitionNamesDescription, getBrowserActionDescription, + getRunGraphaiDescription, getAskFollowupQuestionDescription, getAttemptCompletionDescription, getUseMcpToolDescription, diff --git a/src/core/prompts/tools/run-graphai.ts b/src/core/prompts/tools/run-graphai.ts new file mode 100644 index 0000000000..2bd3a3e054 --- /dev/null +++ b/src/core/prompts/tools/run-graphai.ts @@ -0,0 +1,31 @@ +import { ToolArgs } from "./types" + +export function getRunGraphaiDescription(args: ToolArgs): string | undefined { + return `## run_graphai +Description: Execute a GraphAI workflow file. This tool runs GraphAI YAML or JSON files using the graphai CLI command. GraphAI files define agent workflows with nodes and connections for AI-powered data processing pipelines. The tool validates the file format and structure before execution and provides helpful error messages for common GraphAI issues. +Parameters: +- path: (required) Path to the GraphAI YAML or JSON file to execute. The file must have a .yaml, .yml, or .json extension and contain a valid GraphAI workflow structure with an 'agents' or 'nodes' section. +- chatHistory: (optional) An array of OpenAI-style chat messages with roles and content. Supports JSON strings, structured arrays, and XML format. Will be injected into workflows that have a 'chatHistory' node. +- userPrompt: (optional) A string containing the user's prompt. Will be injected into workflows that have a 'userPrompt' node. +Usage: + +path/to/workflow.yaml + + +Example: Running a GraphAI workflow + +./workflows/data-processing.yaml + + +Example: Running a GraphAI workflow with chat history + +examples/chat-workflow.yaml +[{"role":"user","content":"Hello"},{"role":"assistant","content":"Hi there!"}] +What's the weather like? + + +Example: Running a GraphAI workflow in a subdirectory + +examples/sample-workflow.json +` +} diff --git a/src/core/tools/runGraphaiTool.ts b/src/core/tools/runGraphaiTool.ts new file mode 100644 index 0000000000..f95393ec6d --- /dev/null +++ b/src/core/tools/runGraphaiTool.ts @@ -0,0 +1,379 @@ +import fs from "fs/promises" +import * as path from "path" +import * as YAML from "yaml" +import { GraphAI } from "graphai" +import { httpAgentFilter, streamAgentFilterGenerator } from "@graphai/agent_filters" +import { openAIAgent } from "@graphai/llm_agents" +import * as agents from "@graphai/vanilla" +import { fetchAgent, wikipediaAgent } from "@graphai/service_agents" +import { s3FileAgent, s3FileWriteAgent } from "@tne/tne-agent-v2/lib/agents/browser" +import { codeGenerationTemplateAgent, pythonCodeAgent } from "@tne/tne-agent-v2/lib/agents/python/browser" +import { semanticAgent } from "@tne/tne-agent-v2/lib/agents/rag" + +import { Task } from "../task/Task" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag, ToolResponse } from "../../shared/tools" +import { formatResponse } from "../prompts/responses" +import { unescapeHtmlEntities } from "../../utils/text-normalization" + +/** + * Validates if a file is a valid GraphAI file based on extension + */ +function isValidGraphAIFile(filePath: string): boolean { + const ext = path.extname(filePath).toLowerCase() + return [".yaml", ".yml", ".json"].includes(ext) +} + +/** + * Validates if the file content contains a valid GraphAI structure + */ +async function validateGraphAIContent(filePath: string): Promise<{ isValid: boolean; error?: string }> { + try { + const content = await fs.readFile(filePath, "utf8") + let parsedContent: any + + const ext = path.extname(filePath).toLowerCase() + if (ext === ".json") { + parsedContent = JSON.parse(content) + } else { + parsedContent = YAML.parse(content) + } + + // Check if it has the basic GraphAI structure + if (!parsedContent || typeof parsedContent !== "object") { + return { isValid: false, error: "File does not contain a valid YAML/JSON object" } + } + + // Check for GraphAI-specific structure (agents or nodes) + if (!parsedContent.agents && !parsedContent.nodes) { + return { + isValid: false, + error: "File does not appear to be a GraphAI workflow (missing 'agents' or 'nodes' section)", + } + } + + return { isValid: true } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error) + return { isValid: false, error: `Failed to parse file: ${errorMessage}` } + } +} + +/** + * Maps GraphAI execution errors to user-friendly messages + */ +function mapGraphAIError(error: Error): string { + const message = error.message.toLowerCase() + + if (message.includes("agent") && message.includes("not found")) { + return "Agent not found. Ensure all referenced agents are available in the loaded agent packages (vanilla, openAI, TNE agents, etc.)." + } + + if (message.includes("circular")) { + return "Circular dependency detected in workflow nodes." + } + + if (message.includes("input") || message.includes("reference")) { + return "Invalid input reference. Check node input syntax (:nodeId)." + } + + if (message.includes("timeout")) { + return "GraphAI workflow execution timed out. Check for infinite loops or long-running operations." + } + + return `GraphAI execution error: ${error.message}` +} + +/** + * Formats GraphAI execution results for display + */ +function formatGraphAIResult(result: any, filePath: string): string { + let output = `GraphAI workflow execution completed for: ${path.basename(filePath)}\n\n` + + if (result && typeof result === "object") { + // Check if result has specific output nodes + const resultKeys = Object.keys(result) + if (resultKeys.length > 0) { + output += `Results:\n` + for (const key of resultKeys) { + output += ` ${key}: ${JSON.stringify(result[key], null, 2)}\n` + } + } else { + output += `Result: ${JSON.stringify(result, null, 2)}` + } + } else { + output += `Result: ${result}` + } + + return output +} + +/** + * Parses flexible input formats for chatHistory parameter + */ +function parseFlexibleFormat(input: string, paramName: string): any { + // If input is already an object/array, return as-is + if (typeof input === "object" && input !== null) { + return input + } + + // Try JSON parsing first + try { + const parsed = JSON.parse(input) + return parsed + } catch (jsonError) { + // JSON parsing failed, try XML parsing + try { + return parseXMLMessages(input) + } catch (xmlError) { + // If both fail, throw a descriptive error + throw new Error( + `Invalid format for ${paramName}. Expected JSON array, XML format, or structured data. JSON error: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`, + ) + } + } +} + +/** + * Parses XML format messages into OpenAI-style chat messages + */ +function parseXMLMessages(xmlString: string): any[] { + // Simple XML parsing for message format + // This is a basic implementation - could be enhanced with a proper XML parser + const messages: any[] = [] + + // Match message blocks in XML + const messageRegex = /]*role=["']([^"']+)["'][^>]*>(.*?)<\/message>/gs + let match + + while ((match = messageRegex.exec(xmlString)) !== null) { + const role = match[1] + const content = match[2].trim() + messages.push({ role, content }) + } + + if (messages.length === 0) { + throw new Error("No valid message elements found in XML format") + } + + return messages +} + +export async function runGraphaiTool( + cline: Task, + block: ToolUse, + askApproval: AskApproval, + handleError: HandleError, + pushToolResult: PushToolResult, + removeClosingTag: RemoveClosingTag, +) { + let filePath: string | undefined = block.params.path + const chatHistoryParam: string | undefined = block.params.chatHistory + const userPromptParam: string | undefined = block.params.userPrompt + + try { + if (block.partial) { + await cline.ask("command", removeClosingTag("path", filePath), block.partial).catch(() => {}) + return + } else { + if (!filePath) { + cline.consecutiveMistakeCount++ + cline.recordToolError("run_graphai") + pushToolResult(await cline.sayAndCreateMissingParamError("run_graphai", "path")) + return + } + + // Parse optional parameters + let messages: any[] | undefined + let userMessage: { content: string } | undefined + + if (chatHistoryParam) { + try { + messages = parseFlexibleFormat(chatHistoryParam, "chatHistory") + // Validate that it's an array + if (!Array.isArray(messages)) { + throw new Error("chatHistory must be an array of message objects") + } + } catch (error) { + cline.consecutiveMistakeCount++ + cline.recordToolError("run_graphai") + pushToolResult( + formatResponse.toolError( + `Invalid chatHistory parameter: ${error instanceof Error ? error.message : String(error)}`, + ), + ) + return + } + } + + if (userPromptParam) { + userMessage = { content: userPromptParam } + } + + // Validate file extension + if (!isValidGraphAIFile(filePath)) { + cline.consecutiveMistakeCount++ + cline.recordToolError("run_graphai") + pushToolResult( + formatResponse.toolError( + "Invalid file type. GraphAI files must have .yaml, .yml, or .json extension.", + ), + ) + return + } + + // Resolve file path + const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(cline.cwd, filePath) + + // Check if file exists + try { + await fs.access(resolvedPath) + } catch { + cline.consecutiveMistakeCount++ + cline.recordToolError("run_graphai") + pushToolResult(formatResponse.toolError(`File not found: ${filePath}`)) + return + } + + // Validate GraphAI content + const validation = await validateGraphAIContent(resolvedPath) + if (!validation.isValid) { + cline.consecutiveMistakeCount++ + cline.recordToolError("run_graphai") + pushToolResult( + formatResponse.toolError( + `Invalid GraphAI file: ${validation.error}\n\nGraphAI files should contain an 'agents' or 'nodes' section with workflow definitions.`, + ), + ) + return + } + + cline.consecutiveMistakeCount = 0 + + filePath = unescapeHtmlEntities(filePath) + + const didApprove = await askApproval("command", `Run GraphAI workflow: ${path.basename(filePath)}`) + + if (!didApprove) { + return + } + + // Declare executionLogs at function scope to make it accessible in catch block + const executionLogs: string[] = [] + + try { + // Load and parse the GraphAI workflow file + const workflowContent = await fs.readFile(resolvedPath, "utf8") + const ext = path.extname(resolvedPath).toLowerCase() + + let workflow: any + if (ext === ".json") { + workflow = JSON.parse(workflowContent) + } else { + workflow = YAML.parse(workflowContent) + } + + // Create S3 credentials from environment variables + const s3Credentials = { + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + } + + // Create comprehensive agent collection + const allAgents = { + ...agents, + fetchAgent, + wikipediaAgent, + openAIAgent, + s3FileAgent, + s3FileWriteAgent, + codeGenerationTemplateAgent, + pythonCodeAgent, + semanticAgent, + } + + // Create configuration for agents + const config = { + global: { uid: "london-demo-1-13" }, + s3FileAgent: { credentials: s3Credentials }, + s3FileWriteAgent: { credentials: s3Credentials }, + codeGenerationTemplateAgent: { credentials: s3Credentials }, + openAIAgent: { + apiKey: process.env.OPENAI_API_KEY, + stream: false, + }, + } + + // Create GraphAI instance with all available agents and configuration + const graphai = new GraphAI(workflow, allAgents, { config: config }) + + // Inject optional parameters if provided and corresponding nodes exist + if (messages && graphai.nodes["chatHistory"]) { + graphai.injectValue("chatHistory", messages) + } + if (userMessage && graphai.nodes["userPrompt"]) { + graphai.injectValue("userPrompt", userMessage.content) + } + + // Execute the workflow + const result = await graphai.run() + + // Format and return the results with execution logs + let formattedResult = formatGraphAIResult(result, filePath) + + if (executionLogs.length > 0) { + formattedResult += "\n\n📋 GraphAI Execution Logs:\n" + formattedResult += executionLogs.map((log) => ` ${log}`).join("\n") + } + + pushToolResult(formattedResult) + } catch (error: unknown) { + const errorMessage = error instanceof Error ? mapGraphAIError(error) : String(error) + + let enhancedError = `Failed to execute GraphAI workflow: ${errorMessage}` + + // Add execution logs if available + if (executionLogs.length > 0) { + enhancedError += "\n\n📋 GraphAI Execution Logs:\n" + enhancedError += executionLogs.map((log: string) => ` ${log}`).join("\n") + } + + // Add full error details including stack trace + if (error instanceof Error) { + enhancedError += "\n\n🔍 Full Error Details:\n" + enhancedError += `Error Name: ${error.name}\n` + enhancedError += `Error Message: ${error.message}\n` + if (error.stack) { + enhancedError += `Stack Trace:\n${error.stack}\n` + } + + // Add any additional error properties + const errorObj = error as any + const additionalProps = Object.keys(errorObj).filter( + (key) => !["name", "message", "stack"].includes(key), + ) + if (additionalProps.length > 0) { + enhancedError += "\nAdditional Error Properties:\n" + for (const prop of additionalProps) { + enhancedError += `${prop}: ${JSON.stringify(errorObj[prop], null, 2)}\n` + } + } + + enhancedError += "\n💡 Common GraphAI issues:\n" + enhancedError += + "- Check that all referenced agents are available in the loaded agent packages (vanilla, openAI, TNE agents, etc.)\n" + enhancedError += "- Verify that input references use the correct syntax (:nodeId)\n" + enhancedError += "- Ensure all required agent parameters are provided\n" + enhancedError += "- Check for circular dependencies in the workflow\n" + enhancedError += "- Validate the workflow structure matches GraphAI specifications" + } + + pushToolResult(formatResponse.toolError(enhancedError)) + } + + return + } + } catch (error) { + await handleError("running GraphAI workflow", error) + return + } +} diff --git a/src/eslint.config.mjs b/src/eslint.config.mjs index d0813406d9..2afac436f1 100644 --- a/src/eslint.config.mjs +++ b/src/eslint.config.mjs @@ -1,4 +1,4 @@ -import { config } from "@roo-code/config-eslint/base" +import { config } from "@tne-code/config-eslint/base" /** @type {import("eslint").Linter.Config} */ export default [ diff --git a/src/package.json b/src/package.json index 7ee63dd6f4..ddc6740e99 100644 --- a/src/package.json +++ b/src/package.json @@ -1,9 +1,9 @@ { - "name": "roo-cline", + "name": "tne-code", "displayName": "%extension.displayName%", "description": "%extension.description%", - "publisher": "RooVeterinaryInc", - "version": "3.19.6", + "publisher": "tne-ai", + "version": "0.0.2", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", @@ -14,13 +14,13 @@ "node": "20.19.2" }, "author": { - "name": "Roo Code" + "name": "TNE Code" }, "repository": { "type": "git", - "url": "https://github.com/RooCodeInc/Roo-Code" + "url": "https://github.com/tne-ai/TNE-Code" }, - "homepage": "https://github.com/RooCodeInc/Roo-Code", + "homepage": "https://github.com/tne-ai/TNE-Code", "categories": [ "AI", "Chat", @@ -42,8 +42,8 @@ "sonnet", "ai", "llama", - "roo code", - "roocode" + "tne code", + "tnecode" ], "activationEvents": [ "onLanguage", @@ -54,115 +54,115 @@ "viewsContainers": { "activitybar": [ { - "id": "roo-cline-ActivityBar", + "id": "tne-code-ActivityBar", "title": "%views.activitybar.title%", - "icon": "assets/icons/icon.svg" + "icon": "assets/icons/icon-large.png" } ] }, "views": { - "roo-cline-ActivityBar": [ + "tne-code-ActivityBar": [ { "type": "webview", - "id": "roo-cline.SidebarProvider", + "id": "tne-code.SidebarProvider", "name": "%views.sidebar.name%" } ] }, "commands": [ { - "command": "roo-cline.plusButtonClicked", + "command": "tne-code.plusButtonClicked", "title": "%command.newTask.title%", "icon": "$(add)" }, { - "command": "roo-cline.mcpButtonClicked", + "command": "tne-code.mcpButtonClicked", "title": "%command.mcpServers.title%", "icon": "$(server)" }, { - "command": "roo-cline.promptsButtonClicked", + "command": "tne-code.promptsButtonClicked", "title": "%command.prompts.title%", "icon": "$(organization)" }, { - "command": "roo-cline.historyButtonClicked", + "command": "tne-code.historyButtonClicked", "title": "%command.history.title%", "icon": "$(history)" }, { - "command": "roo-cline.popoutButtonClicked", + "command": "tne-code.popoutButtonClicked", "title": "%command.openInEditor.title%", "icon": "$(link-external)" }, { - "command": "roo-cline.accountButtonClicked", + "command": "tne-code.accountButtonClicked", "title": "Account", "icon": "$(account)", - "when": "config.roo-cline.rooCodeCloudEnabled" + "when": "config.tne-code.tneCodeCloudEnabled" }, { - "command": "roo-cline.settingsButtonClicked", + "command": "tne-code.settingsButtonClicked", "title": "%command.settings.title%", "icon": "$(settings-gear)" }, { - "command": "roo-cline.openInNewTab", + "command": "tne-code.openInNewTab", "title": "%command.openInNewTab.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.explainCode", + "command": "tne-code.explainCode", "title": "%command.explainCode.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.fixCode", + "command": "tne-code.fixCode", "title": "%command.fixCode.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.improveCode", + "command": "tne-code.improveCode", "title": "%command.improveCode.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.addToContext", + "command": "tne-code.addToContext", "title": "%command.addToContext.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.newTask", + "command": "tne-code.newTask", "title": "%command.newTask.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.terminalAddToContext", + "command": "tne-code.terminalAddToContext", "title": "%command.terminal.addToContext.title%", "category": "Terminal" }, { - "command": "roo-cline.terminalFixCommand", + "command": "tne-code.terminalFixCommand", "title": "%command.terminal.fixCommand.title%", "category": "Terminal" }, { - "command": "roo-cline.terminalExplainCommand", + "command": "tne-code.terminalExplainCommand", "title": "%command.terminal.explainCommand.title%", "category": "Terminal" }, { - "command": "roo-cline.setCustomStoragePath", + "command": "tne-code.setCustomStoragePath", "title": "%command.setCustomStoragePath.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.focusInput", + "command": "tne-code.focusInput", "title": "%command.focusInput.title%", "category": "%configuration.title%" }, { - "command": "roo-cline.acceptInput", + "command": "tne-code.acceptInput", "title": "%command.acceptInput.title%", "category": "%configuration.title%" } @@ -170,133 +170,133 @@ "menus": { "editor/context": [ { - "submenu": "roo-cline.contextMenu", + "submenu": "tne-code.contextMenu", "group": "navigation" } ], - "roo-cline.contextMenu": [ + "tne-code.contextMenu": [ { - "command": "roo-cline.addToContext", + "command": "tne-code.addToContext", "group": "1_actions@1" }, { - "command": "roo-cline.explainCode", + "command": "tne-code.explainCode", "group": "1_actions@2" }, { - "command": "roo-cline.improveCode", + "command": "tne-code.improveCode", "group": "1_actions@3" } ], "terminal/context": [ { - "submenu": "roo-cline.terminalMenu", + "submenu": "tne-code.terminalMenu", "group": "navigation" } ], - "roo-cline.terminalMenu": [ + "tne-code.terminalMenu": [ { - "command": "roo-cline.terminalAddToContext", + "command": "tne-code.terminalAddToContext", "group": "1_actions@1" }, { - "command": "roo-cline.terminalFixCommand", + "command": "tne-code.terminalFixCommand", "group": "1_actions@2" }, { - "command": "roo-cline.terminalExplainCommand", + "command": "tne-code.terminalExplainCommand", "group": "1_actions@3" } ], "view/title": [ { - "command": "roo-cline.plusButtonClicked", + "command": "tne-code.plusButtonClicked", "group": "navigation@1", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" }, { - "command": "roo-cline.promptsButtonClicked", + "command": "tne-code.promptsButtonClicked", "group": "navigation@2", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" }, { - "command": "roo-cline.mcpButtonClicked", + "command": "tne-code.mcpButtonClicked", "group": "navigation@3", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" }, { - "command": "roo-cline.historyButtonClicked", + "command": "tne-code.historyButtonClicked", "group": "navigation@4", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" }, { - "command": "roo-cline.popoutButtonClicked", + "command": "tne-code.popoutButtonClicked", "group": "navigation@5", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" }, { - "command": "roo-cline.accountButtonClicked", + "command": "tne-code.accountButtonClicked", "group": "navigation@6", - "when": "view == roo-cline.SidebarProvider && config.roo-cline.rooCodeCloudEnabled" + "when": "view == tne-code.SidebarProvider && config.tne-code.tneCodeCloudEnabled" }, { - "command": "roo-cline.settingsButtonClicked", + "command": "tne-code.settingsButtonClicked", "group": "navigation@7", - "when": "view == roo-cline.SidebarProvider" + "when": "view == tne-code.SidebarProvider" } ], "editor/title": [ { - "command": "roo-cline.plusButtonClicked", + "command": "tne-code.plusButtonClicked", "group": "navigation@1", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" }, { - "command": "roo-cline.promptsButtonClicked", + "command": "tne-code.promptsButtonClicked", "group": "navigation@2", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" }, { - "command": "roo-cline.mcpButtonClicked", + "command": "tne-code.mcpButtonClicked", "group": "navigation@3", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" }, { - "command": "roo-cline.historyButtonClicked", + "command": "tne-code.historyButtonClicked", "group": "navigation@4", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" }, { - "command": "roo-cline.popoutButtonClicked", + "command": "tne-code.popoutButtonClicked", "group": "navigation@5", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" }, { - "command": "roo-cline.accountButtonClicked", + "command": "tne-code.accountButtonClicked", "group": "navigation@6", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider && config.roo-cline.rooCodeCloudEnabled" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider && config.tne-code.tneCodeCloudEnabled" }, { - "command": "roo-cline.settingsButtonClicked", + "command": "tne-code.settingsButtonClicked", "group": "navigation@7", - "when": "activeWebviewPanelId == roo-cline.TabPanelProvider" + "when": "activeWebviewPanelId == tne-code.TabPanelProvider" } ] }, "submenus": [ { - "id": "roo-cline.contextMenu", + "id": "tne-code.contextMenu", "label": "%views.contextMenu.label%" }, { - "id": "roo-cline.terminalMenu", + "id": "tne-code.terminalMenu", "label": "%views.terminalMenu.label%" } ], "configuration": { "title": "%configuration.title%", "properties": { - "roo-cline.allowedCommands": { + "tne-code.allowedCommands": { "type": "array", "items": { "type": "string" @@ -311,7 +311,7 @@ ], "description": "%commands.allowedCommands.description%" }, - "roo-cline.vsCodeLmModelSelector": { + "tne-code.vsCodeLmModelSelector": { "type": "object", "properties": { "vendor": { @@ -325,12 +325,12 @@ }, "description": "%settings.vsCodeLmModelSelector.description%" }, - "roo-cline.customStoragePath": { + "tne-code.customStoragePath": { "type": "string", "default": "", "description": "%settings.customStoragePath.description%" }, - "roo-cline.rooCodeCloudEnabled": { + "tne-code.tneCodeCloudEnabled": { "type": "boolean", "default": false, "description": "%settings.rooCodeCloudEnabled.description%" @@ -359,13 +359,21 @@ "@aws-sdk/client-bedrock-runtime": "^3.779.0", "@aws-sdk/credential-providers": "^3.806.0", "@google/genai": "^1.0.0", + "@graphai/agent_filters": "^2.0.0", + "@graphai/llm_agents": "^2.0.1", + "@graphai/vanilla": "^2.0.4", + "@google/genai": "^1.0.0", + "@graphai/agent_filters": "^2.0.0", + "@graphai/llm_agents": "^2.0.1", + "@graphai/vanilla": "^2.0.4", "@mistralai/mistralai": "^1.3.6", "@modelcontextprotocol/sdk": "^1.9.0", - "@roo-code/cloud": "workspace:^", - "@roo-code/ipc": "workspace:^", - "@roo-code/telemetry": "workspace:^", - "@roo-code/types": "workspace:^", "@qdrant/js-client-rest": "^1.14.0", + "@tne-code/cloud": "workspace:^", + "@tne-code/ipc": "workspace:^", + "@tne-code/telemetry": "workspace:^", + "@tne-code/types": "workspace:^", + "@tne/tne-agent-v2": "file:../packages/tne-tne-agent-v2-0.0.1.j.tgz", "@types/lodash.debounce": "^4.0.9", "@vscode/codicons": "^0.0.36", "async-mutex": "^0.5.0", @@ -384,6 +392,7 @@ "get-folder-size": "^5.0.0", "google-auth-library": "^9.15.1", "i18next": "^25.0.0", + "graphai": "^2.0.5", "ignore": "^7.0.3", "isbinaryfile": "^5.0.2", "lodash.debounce": "^4.0.8", @@ -423,9 +432,9 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", - "@roo-code/build": "workspace:^", - "@roo-code/config-eslint": "workspace:^", - "@roo-code/config-typescript": "workspace:^", + "@tne-code/build": "workspace:^", + "@tne-code/config-eslint": "workspace:^", + "@tne-code/config-typescript": "workspace:^", "@types/clone-deep": "^4.0.4", "@types/debug": "^4.1.12", "@types/diff": "^5.2.1", diff --git a/src/package.nls.json b/src/package.nls.json index d43010b788..d9ef4887af 100644 --- a/src/package.nls.json +++ b/src/package.nls.json @@ -1,10 +1,10 @@ { - "extension.displayName": "Roo Code (prev. Roo Cline)", + "extension.displayName": "TNE Code (prev. Roo Cline)", "extension.description": "A whole dev team of AI agents in your editor.", - "views.contextMenu.label": "Roo Code", - "views.terminalMenu.label": "Roo Code", - "views.activitybar.title": "Roo Code", - "views.sidebar.name": "Roo Code", + "views.contextMenu.label": "TNE Code", + "views.terminalMenu.label": "TNE Code", + "views.activitybar.title": "TNE Code", + "views.sidebar.name": "TNE Code", "command.newTask.title": "New Task", "command.mcpServers.title": "MCP Servers", "command.prompts.title": "Modes", @@ -23,11 +23,11 @@ "command.terminal.fixCommand.title": "Fix This Command", "command.terminal.explainCommand.title": "Explain This Command", "command.acceptInput.title": "Accept Input/Suggestion", - "configuration.title": "Roo Code", + "configuration.title": "TNE Code", "commands.allowedCommands.description": "Commands that can be auto-executed when 'Always approve execute operations' is enabled", "settings.vsCodeLmModelSelector.description": "Settings for VSCode Language Model API", "settings.vsCodeLmModelSelector.vendor.description": "The vendor of the language model (e.g. copilot)", "settings.vsCodeLmModelSelector.family.description": "The family of the language model (e.g. gpt-4)", - "settings.customStoragePath.description": "Custom storage path. Leave empty to use the default location. Supports absolute paths (e.g. 'D:\\RooCodeStorage')", - "settings.rooCodeCloudEnabled.description": "Enable Roo Code Cloud." + "settings.customStoragePath.description": "Custom storage path. Leave empty to use the default location. Supports absolute paths (e.g. 'D:\\TNECodeStorage')", + "settings.rooCodeCloudEnabled.description": "Enable TNE Code Cloud." } diff --git a/src/shared/__tests__/modes.test.ts b/src/shared/__tests__/modes.test.ts index f5de88cb9e..959d99e66f 100644 --- a/src/shared/__tests__/modes.test.ts +++ b/src/shared/__tests__/modes.test.ts @@ -279,7 +279,7 @@ describe("FileRestrictionError", () => { slug: "debug", name: "🪲 Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are TNE-Code, an expert software debugger specializing in systematic problem diagnosis and resolution.", groups: ["read", "edit", "browser", "command", "mcp"], }) expect(debugMode?.customInstructions).toContain( @@ -300,7 +300,7 @@ describe("FileRestrictionError", () => { slug: "debug", name: "🪲 Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are TNE-Code, an expert software debugger specializing in systematic problem diagnosis and resolution.", }) }) diff --git a/src/shared/modes.ts b/src/shared/modes.ts index c735118f66..2bce45f1c5 100644 --- a/src/shared/modes.ts +++ b/src/shared/modes.ts @@ -65,14 +65,14 @@ export const modes: readonly ModeConfig[] = [ slug: "code", name: "💻 Code", roleDefinition: - "You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", + "You are TNE-Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", groups: ["read", "edit", "browser", "command", "mcp"], }, { slug: "architect", name: "🏗️ Architect", roleDefinition: - "You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", + "You are TNE-Code, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"], customInstructions: "1. Do some information gathering (for example using read_file or search_files) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, you should create a detailed plan for how to accomplish the task. Include Mermaid diagrams if they help make your plan clearer.\n\n4. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and plan the best way to accomplish it.\n\n5. Once the user confirms the plan, ask them if they'd like you to write it to a markdown file.\n\n6. Use the switch_mode tool to request that the user switch to another mode to implement the solution.", @@ -81,7 +81,7 @@ export const modes: readonly ModeConfig[] = [ slug: "ask", name: "❓ Ask", roleDefinition: - "You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", + "You are TNE-Code, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", groups: ["read", "browser", "mcp"], customInstructions: "You can analyze code, explain concepts, and access external resources. Always answer the user’s questions thoroughly, and do not switch to implementing code unless explicitly requested by the user. Include Mermaid diagrams when they clarify your response.", @@ -90,7 +90,7 @@ export const modes: readonly ModeConfig[] = [ slug: "debug", name: "🪲 Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are TNE-Code, an expert software debugger specializing in systematic problem diagnosis and resolution.", groups: ["read", "edit", "browser", "command", "mcp"], customInstructions: "Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.", @@ -99,11 +99,2298 @@ export const modes: readonly ModeConfig[] = [ slug: "orchestrator", name: "🪃 Orchestrator", roleDefinition: - "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.", + "You are TNE-Code, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.", groups: [], customInstructions: "Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\n\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\n\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\n * All necessary context from the parent task or previous subtasks required to complete the work.\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\n\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\n\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\n\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\n\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\n\n7. Suggest improvements to the workflow based on the results of completed subtasks.\n\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.", }, + { + slug: "fullstack", + name: "🌐 FullStack", + roleDefinition: + "You are TNE-Code, a full-stack orchestrator who coordinates UI/UX → GraphAI → Deploy workflows. You understand the complete application lifecycle from frontend development through GraphAI workflow creation to deployment automation using our standard toolchain.", + groups: ["read", "browser", "mcp"], + customInstructions: + "Your workflow follows this pattern:\n\n1. **Frontend**: Use the UI/UX mode to generate the UI with scaffolding for GraphAI.\n2. **GraphAI Development**: Develop GraphAI workflows for backend logic and AI orchestration (GraphAI mode).\n3. **Deployment**: Deploy using tne-ci-mcp server to cloud environments (Deploy mode).\n\nUse `new_task` to delegate specialized work to UI/UX, GraphAI, and Deploy modes.", + }, + { + slug: "fullstack-architect", + name: "📓 FullStack Architect", + roleDefinition: + "You are TNE-Code, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", + groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"], + customInstructions: `1. Do some information gathering (for example using read_file or search_files) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, you should create a detailed plan for how to accomplish the task. Include Mermaid diagrams if they help make your plan clearer.\n\n4. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and plan the best way to accomplish it.\n\n5. Once the user confirms the plan, ask them if they'd like you to write it to a markdown file.\n\n6. Use the switch_mode tool to request that the user switch to another mode to implement the solution. 7. Use the uiux mode for UI development, graphai mode for GraphAI development, and deploy mode for deploying. 8. Include the following information in your document if needed. It contains crucial boilerplate and setup information that will cause failure if not adhered to. + + # GraphAI Environment + As TNE-Code, our organization's resident application development agent, you are well-versed in our standard development practices and can implement them yourself like a senior developer. + We build full-stack, AI-powered applications using GraphAI as our LLM orchestration tool. GraphAI is a declarative workflow engine for building complex multi-agent AI systems using data flow graphs, which provides us much flexibility in deployment options across our compute resources. + Here a simple example of GraphAI. + version: 0.5 + nodes: + userPrompt: + value: "" + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + isResult: true + + As you develop full-stack applications, you must adhere to the following guidelines when writing code so that it is compatible with our development practices and cloud infrastructure. + + ### Tooling standards + + Our organization uses graphai as our standard LLM orchestration package, vite as our development environment for frontend assets, and yarn as our package manager. + + The following package.json should be used as a starting point for project dependencies. Note the use of vite, rollup, and React, as well as the GraphAI imports. + + + { + "name": "", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint src", + "lint-fix": "eslint src --ext js,jsx,ts,tsx --report-unused-disable-directives --fix", + "tsc-watch": "npx tsc -noEmit --watch", + "preview": "vite preview", + "test": "vitest" + }, + "dependencies": { + "@graphai/agent_filters": "^2.0.0", + "@graphai/http_client_agent_filter": "^2.0.1", + "@graphai/llm_agents": "^2.0.1", + "@graphai/service_agents": "^2.0.1", + "@graphai/stream_agent_filter": "^2.0.2", + "@graphai/vanilla": "^2.0.4", + "@tne/tne-agent-v2": "file:../packages/tne-tne-agent-v2-0.0.1.j.tgz", + "graphai": "^2.0.5", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.6.2", + "typescript": "^4.9.5", + "yaml": "^2.8.0", + "zustand": "^5.0.5" + }, + "devDependencies": { + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-sucrase": "^5.0.2", + "@rollup/plugin-typescript": "^12.1.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.126", + "@types/react": "^19.1.6", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.1", + "rollup": "^3.25.0", + "rollup-plugin-postcss": "^4.0.0", + "vite": "^5.1.4", + "vite-plugin-checker": "^0.6.4", + "vitest": "^1.3.1" + }, + "browserslist": { + "production": [">0.2%", "not dead", "not op_mini all"], + "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] + } + } + + + The following vite.config.js should be used as a starting point. + + + import { defineConfig, loadEnv } from "vite" + import react from "@vitejs/plugin-react" + import checker from "vite-plugin-checker" + import { resolve } from "path" + + // https://vitejs.dev/config/ + export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + + return { + base: "/", + build: { + outDir: "dist", + assetsDir: "assets", + commonjsOptions: { transformMixedEsModules: true }, + rollupOptions: { + output: { + manualChunks: { + vendor: ["react", "react-dom"], + graphai: ["graphai", "@graphai/vanilla", "@graphai/llm_agents"], + // Only include packages that are actually installed: + // mui: ['@mui/material', '@mui/icons-material', '@mui/x-data-grid'], + // charts: ['recharts'], + }, + }, + }, + }, + plugins: [ + react(), + checker({ + typescript: true, + eslint: { + lintCommand: "eslint", + }, + }), + ], + define: { + global: "globalThis", + }, + resolve: { + alias: { + "@": resolve(__dirname, "src"), + async_hooks: "async_hooks-browserify", + }, + }, + optimizeDeps: { + exclude: ["@graphai/agent_filters"], + }, + } + }) + + + You'll also need a src/vite-env.d.ts file: + + + /// + + interface ImportMetaEnv { + readonly VITE_USE_SERVER_AGENTS?: string; + readonly VITE_GRAPHAI_SERVER_URL?: string; + readonly VITE_OPENAI_API_KEY?: string; + } + + interface ImportMeta { + readonly env: ImportMetaEnv; + + + The following rollup.config.js should be used as a starting point. + + + import path from "path" + import { fileURLToPath } from "url" + import alias from "@rollup/plugin-alias" + import resolve from "@rollup/plugin-node-resolve" + import commonjs from "@rollup/plugin-commonjs" + import postcss from "rollup-plugin-postcss" + import json from "@rollup/plugin-json" + import sucrase from "@rollup/plugin-sucrase" + + // Convert import.meta.url to __dirname + const __filename = fileURLToPath(import.meta.url) + const __dirname = path.dirname(__filename) + + export default { + input: "src/main.tsx", + output: { + dir: "dist", + format: "iife", // Use 'iife' for a self-executing function suitable for browsers + name: "", // Name of the global variable for your app + sourcemap: true, + }, + plugins: [ + alias({ + entries: [{ find: "@", replacement: path.resolve(__dirname, "src") }], + }), + resolve({ + browser: true, // Ensure resolution of browser-compatible modules + preferBuiltins: false, // Disable Node.js built-ins + }), + commonjs({ + include: /node_modules/, // Include all dependencies in node_modules + requireReturnsDefault: "auto", // Attempt to automatically handle default exports + }), + json(), + postcss({ + extensions: [".css"], + }), + sucrase({ + exclude: ["node_modules/**", "**/*.css", "**/*.json"], + transforms: ["typescript", "jsx"], + }), + ], + context: "window", + watch: { + chunkSizeWarningLimit: 1000, + }, + } + + + The following tsconfig.json should be used as a starting point. + + + { + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ES2020", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": "src", + "paths": { + "@/*": ["./*"] + }, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Additional options for compatibility */ + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] + } + + + The following tsconfig.node.json should be used as a starting point. + + + { + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ES2020", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true, + "allowJs": true + }, + "include": ["vite.config.*", "*.config.*"], + "exclude": ["node_modules", "dist"] + } + + + + ## GraphAI Integration + + This section demonstrates how to integrate GraphAI into a TypeScript application with environment-aware configuration. The service automatically adapts between local development and production environments using the environment variable management system. + + ### Important: React Import Configuration + + When using React 17+ with the new JSX transform, you should **NOT** import React directly in your components. Instead: + + **❌ Don't do this:** + + + import React, { useState } from "react" + + + **✅ Do this instead:** + + + import { useState } from "react" + + + **For main.tsx, use StrictMode directly:** + + + import { StrictMode } from 'react' + import ReactDOM from 'react-dom/client' + import App from './App' + + ReactDOM.createRoot(document.getElementById('root')!).render( + + + , + ) + + + ### Vite Environment Types + + Create a src/vite-env.d.ts file to properly configure TypeScript for Vite and React: + + + /// + /// + /// + + interface ImportMetaEnv { + readonly MODE: string + readonly BASE_URL: string + readonly PROD: boolean + readonly DEV: boolean + readonly VITE_USE_SERVER_AGENTS?: string + readonly VITE_GRAPHAI_SERVER_URL?: string + readonly VITE_OPENAI_API_KEY?: string + } + + interface ImportMeta { + readonly env: ImportMetaEnv + } + + + ### GraphAI Service Implementation + + + import { streamAgentFilterGenerator } from "@graphai/stream_agent_filter" + import { httpAgentFilter } from "@graphai/http_client_agent_filter" + import { GraphAI, AgentFunctionContext } from "graphai" + import { openAIAgent } from "@graphai/llm_agents" + import * as agents from "@graphai/vanilla" + import { fetchAgent } from "@graphai/service_agents" + import * as YAML from "yaml" + import { getAppConfig, AppConfig } from "../config/environment" + + // Define interfaces for your data and responses + interface DataItem { + id: string + name: string + category: string + metadata: Record + } + + interface GraphAIResponse { + success: boolean + result?: string + error?: string + } + + class GraphAIService { + private allAgents: any + private config: any + private workflow: any + private appConfig: AppConfig + + constructor() { + // Load environment configuration + this.appConfig = getAppConfig() + + // Create comprehensive agent collection + // Only include openAIAgent for local development + this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, + } + + // Create configuration for agents + // Only configure openAI for local development + this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } + + // Load the workflow + this.loadWorkflow() + } + + /** + * Load the GraphAI workflow from YAML file + */ + private async loadWorkflow(): Promise { + try { + const response = await fetch("/your-workflow.yaml") + const workflowContent = await response.text() + this.workflow = YAML.parse(workflowContent) + } catch (error) { + console.error("Failed to load workflow:", error) + } + } + + /** + * Format structured data for GraphAI workflows + * This demonstrates how to prepare any type of data for injection + */ + private formatDataCollection(items: DataItem[]): string { + return items + .map((item) => { + return \` + Item: \${item.name} (ID: \${item.id}) + Category: \${item.category} + Metadata: \${JSON.stringify(item.metadata, null, 2)} + ---\` + }) + .join("\n") + } + + /** + * Execute workflow with environment-aware configuration + */ + async executeGraphAI( + query: string, + data: DataItem[], + onStream: (response: string) => void, + ): Promise { + try { + // Ensure workflow is loaded + if (!this.workflow) { + await this.loadWorkflow() + } + + let lastNodeId: string | null = null + const streamCallback = (context: AgentFunctionContext, token: string) => { + console.log(token) + if (context.debugInfo.nodeId !== lastNodeId && lastNodeId !== null) { + onStream("\n\n") + } + lastNodeId = context.debugInfo.nodeId + onStream(token) + } + + // Agent filters for processing + const streamAgentFilter = streamAgentFilterGenerator(streamCallback) + + // Configure server agents based on environment + const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + + const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, + ] + + // Format your data for injection + const dataCollectionText = this.formatDataCollection(data) + + const graphai = new GraphAI(this.workflow, this.allAgents, { + agentFilters: agentFilters, + config: this.config, + }) + + // Inject values + graphai.injectValue("userPrompt", query) + graphai.injectValue("dataCollection", dataCollectionText) + + /* + CRITICAL: Use injectValue() to pass data into + your workflow. This allows you to inject any type of data: + structured data, images, files, etc. + + You can inject multiple types of data: + graphai.injectValue("imageData", base64ImageString); + graphai.injectValue("fileContent", fileContentString); + graphai.injectValue("contextData", JSON.stringify(contextObject)); + + Note that the static node type must match the injected data. + To inject an array object, the static node must look like: + + nodeName: + value: [] + */ + + // Logging with environment context + graphai.onLogCallback = ({ nodeId, agentId, state, errorMessage: errorMessage }) => { + if (!errorMessage) { + console.log( + \`\${nodeId} \${agentId} \${state} (\${this.appConfig.useServerAgents ? "server" : "local"})\`, + ) + } else { + console.log(\`ERROR: \${nodeId} \${agentId} \${state}: \${errorMessage}\`) + } + } + + const result = await graphai.run() + + return { + success: true, + result: this.formatGraphAIResult(result), + } + } catch (error) { + console.error("GraphAI error:", error) + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error occurred", + } + } + } + + /** + * Format GraphAI result for display + */ + private formatGraphAIResult(result: any): string { + if (result && typeof result === "object") { + const resultKeys = Object.keys(result) + if (resultKeys.length > 0) { + // Return the first result node's content + const firstKey = resultKeys[0] + const firstResult = result[firstKey] + + if (typeof firstResult === "string") { + return firstResult + } else if (firstResult && firstResult.text) { + return firstResult.text + } else { + return JSON.stringify(firstResult, null, 2) + } + } + } + + return typeof result === "string" ? result : JSON.stringify(result, null, 2) + } + + /** + * Get current configuration info for debugging + */ + getConfigInfo(): { environment: string; useServerAgents: boolean; serverUrl: string } { + return { + environment: this.appConfig.isProduction ? "production" : "development", + useServerAgents: this.appConfig.useServerAgents, + serverUrl: this.appConfig.graphaiServerUrl, + } + } + } + + const graphAIServiceInstance = new GraphAIService() + export default graphAIServiceInstance + + + ## Using the GraphAI Service in React + + Here's a minimal example showing how to import and use the GraphAI service in a React component: + + + import { useState, useCallback } from 'react'; + import graphaiService, { GraphAIResponse } from '../services/graphaiService'; + + const AIComponent: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + const [response, setResponse] = useState(''); + const [error, setError] = useState(''); + + // Your application data + const data: DataItem[] = []; // Replace with your actual data + + const handleQuery = useCallback(async (query: string) => { + if (!query.trim()) return; + + // Clear previous state before starting new query + setError(''); + setResponse(''); + setIsLoading(true); + + try { + // Track if we've received the first token to improve UX + let hasReceivedFirstToken = false; + + // Stream callback for real-time updates + const onStream = (token: string) => { + // Stop loading spinner as soon as first token arrives for better UX + // This allows users to see content appearing immediately + if (!hasReceivedFirstToken) { + hasReceivedFirstToken = true; + setIsLoading(false); + } + + setResponse(prev => prev + token); + }; + + // Execute GraphAI workflow + const result: GraphAIResponse = await graphaiService.executeGraphAI( + query, + data, + onStream + ); + + if (result.success && result.result) { + // Ensure final complete response is displayed + // This handles cases where streaming doesn't work or is incomplete + setResponse(result.result); + } else if (!result.success && result.error) { + setError(result.error); + setResponse(''); + } + } catch (error) { + console.error('GraphAI error:', error); + setError(error instanceof Error ? error.message : 'An unexpected error occurred'); + setResponse(''); + } finally { + // Always stop loading at the end as a safety net + setIsLoading(false); + } + }, [data]); + + return ( +
+ e.key === 'Enter' && handleQuery(e.currentTarget.value)} + placeholder="Ask anything..." + /> + + + {isLoading &&

Loading...

} + {error &&

{error}

} + {response && ( +
+ {response} + {isLoading && |} {/* Show cursor while streaming */} +
+ )} +
+ ); + }; + + + ## Environment Variable Management + + ### Overview + + The GraphAI application uses a sophisticated environment variable management system that adapts between local development and production deployment environments. Environment variables control how GraphAI agents are configured and whether they run locally or on remote servers. + + ### Environment Configuration Structure + + #### Key Environment Variables + + - **VITE_USE_SERVER_AGENTS**: Controls whether to use server-side GraphAI agents or local agents + - **VITE_GRAPHAI_SERVER_URL**: URL endpoint for the GraphAI server when using server agents + - **VITE_OPENAI_API_KEY**: OpenAI API key for local development (only used when not using server agents) + + #### Environment Detection Logic + + + const isProduction = import.meta.env.PROD + const useServerAgents = import.meta.env.VITE_USE_SERVER_AGENTS === "true" || isProduction + + const config = { + isProduction, + useServerAgents, + graphaiServerUrl: import.meta.env.VITE_GRAPHAI_SERVER_URL || "http://localhost:8085/agents", + openaiApiKey: useServerAgents ? undefined : import.meta.env.VITE_OPENAI_API_KEY, + } + + + ### GraphAI Service Integration + + This component automatically adapts its configuration based on environment variables: + + #### Agent Configuration + + + // Agent collection - same for all environments + this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, + } + + // Configuration adapts based on environment + this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } + + + #### Server Agent Filtering + + When using server agents, the service configures HTTP agent filters to route specific agents to the remote server: + + + // Configure server agents based on environment + const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + + const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, + ] + + + ### Environment Files + + The application supports different environment configurations: + + - **Development**: Uses local OpenAI API key, agents run in browser + - **Production**: Uses server agents, no API key needed in browser + + #### Vite Configuration + + The [vite.config.js](wine-cellar-app/vite.config.js) automatically loads environment variables: + + + export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + // Environment variables are automatically available as import.meta.env.* + }) + + + ### Debugging Environment Variables + + The environment configuration includes comprehensive logging for debugging: + + + console.log("=== Environment Variables Debug ===") + console.log("import.meta.env.PROD:", import.meta.env.PROD) + console.log("import.meta.env.DEV:", import.meta.env.DEV) + console.log("import.meta.env.MODE:", import.meta.env.MODE) + console.log("import.meta.env.VITE_USE_SERVER_AGENTS:", import.meta.env.VITE_USE_SERVER_AGENTS) + console.log("import.meta.env.VITE_GRAPHAI_SERVER_URL:", import.meta.env.VITE_GRAPHAI_SERVER_URL) + console.log("===================================") + + + Use the following defaults for your server configuration (both dev and prod deployments). + + + # Development/staging environment + # Use server-side GraphAI processing + VITE_USE_SERVER_AGENTS=true + VITE_GRAPHAI_SERVER_URL=https://graphai.dev.tne.ai/agents + + + # GraphAI Tutorial + ## Hello World + + [GraphAI](https://github.com/receptron/graphai) is an open source project, which allows non-programmers to build AI applications by describing data flows in a declarative language, GraphAI. + + Here a simple example of GraphAI. + + + version: 0.5 + nodes: + llm1: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: Explain ML's transformer in 100 words. + isResult: true + llm2: + agent: openAIAgent + params: + model: gpt-4o + inputs: + system: Provide a a 50 word summary of your input. + prompt: :llm1.text + isResult: true + + + It has two nodes: + + 1. **llm1**: This node is associated with "openAIAgent", which calls OpenAI's chat completion API. It takes "Explain ML's transformer in 100 words." as an input (the user prompt) and outputs the result from the chat completion API. + 2. **llm2**: This node receives the output of the **llm2** node, as an input, and performs an additional LLM call to summarize tie 100 words down to 50. + + Notice that **llm1** node will be executed immediately because all the inputs are available at the beginning, while **llm2** node will be executed when the data from **llm1** node becomes available. If llm2 did not accept input from llm1, and instead had a prompt of :userPrompt, the two nodes would execute concurrently. + + Because isResult is set to true from **llm1** and **llm2**, both will display to the console. + + ## Computed Node and Static Node + + There are two types of nodes in GraphAI, _computed nodes_ and _static nodes_. + + A computed node is associated with an _agent_, which performs a certain computation. Both nodes in the previous examples are _computed nodes_. + + A _static nodes_ is a place holder of a value, just like a _variable_ in computer languages. + + In our organization, it is convention that a single message is passed into the LLM workflow by using a static node called userPrompt. Entire chat histories (represented by an array of OpenAI-style messages with a role and content) are passed in through the chatHistory static node. + + When creating a workflow that has a placeholder to accept user input in either of these forms, initialize an empty userPrompt and/or chatHistory node as follows. + + + nodes: + userPrompt: + value: "" + chatHistory: + value: [] + + + The example below performs a similar operation as the previous example, but uses one _static node_, **userPrompt**, which holds the value "Explain ML's transformer in 100 words". + + + version: 0.5 + nodes: + userPrompt: + value: Explain ML's transformer in 100 words. + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + output: + agent: copyAgent + params: + namedKey: text + console: + after: true + inputs: + text: :llm.text + + + ## Loop / Mapping + + The dataflow graph needs to be acyclic by design, but we added a few control flow mechanisms, such as loop, nesting, if/unless and mapping (of map-reduce). Note the syntax to access :shift.item inside a string. + + ### Loop + + Here is a simple application, which uses **loop**. + + + version: 0.5 + loop: + while: :fruits + nodes: + fruits: + value: + - apple + - lemon + - banana + update: :shift.array + result: + value: [] + update: :reducer.array + isResult: true + shift: + agent: shiftAgent + inputs: + array: :fruits + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: What is the typical color of \${:shift.item}? Just answer the color. + isResult: true + reducer: + agent: pushAgent + inputs: + array: :result + item: :llm.text + + + + 1. **fruits**: This static node holds the list of fruits at the beginning but updated with the array property of **shift** node after each iteration. + 2. **result**: This static node starts with an empty array, but updated with the value of **reducer** node after each iteration. + 3. **shift**: This node takes the first item from the value from **fruits** node, and output the remaining array and item as properties. + 4. **llm**: This computed node generates a prompt using the template "What is the typical color of \${:shift.item}? Just answer the color." by applying the item property from the shift node's output. It then passes this prompt to gpt-4o to obtain the generated result. + 5. **reducer**: This node pushes the content from the output of **llm** node to the value of **result** node. + + Please notice that each item in the array will be processed sequentially. To process them concurrently, see the section below. + + ## Parallel Execution + S3 File Access + + This example uses s3FileAgent to access images in S3. In this case, the images contain tabular data, and mapAgent is used to perform OCR in parallel for each image. The extracted tables from each image are combined into a single result. + + Use mapAgent for processes which take a list as input, when the objective is to process all list items concurrently. Use a traditional loop for iterative processing. + + + version: 0.5 + nodes: + imageData1: + agent: s3FileAgent + params: + fileName: image input 1.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData2: + agent: s3FileAgent + params: + fileName: image input 2.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData3: + agent: s3FileAgent + params: + fileName: image input 3.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageExtractor: + agent: mapAgent + inputs: + rows: + - ":imageData1.imageData" + - ":imageData2.imageData" + - ":imageData3.imageData" + params: {} + graph: + version: 0.5 + nodes: + imageExtraction: + agent: openAIAgent + inputs: + messages: + - role: user + content: + - type: image_url + image_url: + url: "\${:row}" + system: From the given image(s), extract the tabular data in a CSV format. + console: true + filterExtraction: + agent: copyAgent + inputs: + text: ":imageExtraction.text" + params: + namedKey: text + isResult: true + console: true + aggregateImageExtraction: + agent: jsonParserAgent + inputs: + data: ":imageExtractor" + console: true + synthesizeLlm: + agent: openAIAgent + inputs: + prompt: ":aggregateImageExtraction.text" + system: From the given list, synthesize all tabular data into one or more tables + isResult: true + console: true + + + ## Nested Workflows + Conditional Logic + + ### Nesting + + A node can itself be a GraphAI workflow, which is executed through nestedAgent. The following example uses fetchAgent to pull documentation from the given URLs, then generates a GraphAI workflow, which is executed through the use of nestedAgent. + + ### Conditional logic + + Computed nodes can execute upon a condition being met using if/unless syntax and compareAgent. In this example, the fetchAPI node returns True if the user is asking a question that may require external APIs (like the current weather), otherwise False if it can be answered with general knowledge. The checkAPICallNeeded node evaluates to True if the fetchAPI.text value is not False. Nodes can now use if/unless syntax to conditionally execute based off of this evaluation. + + + version: 0.5 + nodes: + userPrompt: + value: "" + + llmEngine: + value: "openAIAgent" + + fetchAPI: + agent: ":llmEngine" + inputs: + prompt: ":userPrompt" + system: >- + You are capable of either returning True or False. Return True if the user is asking for information which would require external knowledge, and False otherwise. + + checkAPICallNeeded: + agent: compareAgent + inputs: + array: [":fetchAPI.text", "!=", "False"] + + conversationLLM: + agent: ":llmEngine" + inputs: + system: You are a helpful chat assistant. + prompt: ":userPrompt" + unless: ":checkAPICallNeeded.result" + isResult: true + + document: + agent: fetchAgent + console: + before: "...fetching document" + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/main/packages/graphai/README.md + + sampleGraph: + agent: fetchAgent + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/refs/heads/main/packages/samples/src/net/weather.ts + + graphGenerator: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - >- + You an expert in GraphAI programming. You are responsible in generating a graphAI graph to answer the user question. Always store the results in a node called 'output', with isResult set to true. + - "graphAI graph outputs in json format" + - "[documentation of GraphAI]\n\${:document}" + - "[sample graph]\n\`\`\`json\n\${:sampleGraph}\n\`\`\`" + - "For weather, directly input the latitude/longitude into the GraphAI graph you write" + params: + temperature: 0 + isResult: true + + execute: + if: ":checkAPICallNeeded.result" + agent: nestedAgent + graph: ":graphGenerator.text.codeBlock().jsonParse()" + + summarize: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - "Output to summarize:\n\n" + - ":execute.output" + - "Instructions\n\n" + - "Succinctly summarize the data you've received to answer the user question in the chat history." + isResult: true + `, + }, + { + slug: "uiux", + name: "🎨 UI/UX", + roleDefinition: + "You are TNE-Code, a UI/UX specialist who implements frontend applications with GraphAI scaffolding. You excel at creating responsive, accessible interfaces using React, Vite, and modern web technologies while integrating seamlessly with GraphAI workflows.", + groups: ["read", "edit", "browser", "command"], + customInstructions: `## GraphAI Environment + As TNE-Code, our organization's resident application development agent, you are well-versed in our standard development practices and can implement them yourself like a senior developer. + We build full-stack, AI-powered applications using GraphAI as our LLM orchestration tool. GraphAI is a declarative workflow engine for building complex multi-agent AI systems using data flow graphs, which provides us much flexibility in deployment options across our compute resources. + Here a simple example of GraphAI. + version: 0.5 + nodes: + userPrompt: + value: "" + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + isResult: true + + As you develop full-stack applications, you must adhere to the following guidelines when writing code so that it is compatible with our development practices and cloud infrastructure. + + ### Tooling standards + + Our organization uses graphai as our standard LLM orchestration package, vite as our development environment for frontend assets, and yarn as our package manager. + + The following package.json should be used as a starting point for project dependencies. Note the use of vite, rollup, and React, as well as the GraphAI imports. + + + { + "name": "", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint src", + "lint-fix": "eslint src --ext js,jsx,ts,tsx --report-unused-disable-directives --fix", + "tsc-watch": "npx tsc -noEmit --watch", + "preview": "vite preview", + "test": "vitest" + }, + "dependencies": { + "@graphai/agent_filters": "^2.0.0", + "@graphai/http_client_agent_filter": "^2.0.1", + "@graphai/llm_agents": "^2.0.1", + "@graphai/service_agents": "^2.0.1", + "@graphai/stream_agent_filter": "^2.0.2", + "@graphai/vanilla": "^2.0.4", + "@tne/tne-agent-v2": "file:../packages/tne-tne-agent-v2-0.0.1.j.tgz", + "graphai": "^2.0.5", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.6.2", + "typescript": "^4.9.5", + "yaml": "^2.8.0", + "zustand": "^5.0.5" + }, + "devDependencies": { + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-sucrase": "^5.0.2", + "@rollup/plugin-typescript": "^12.1.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.126", + "@types/react": "^19.1.6", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.1", + "rollup": "^3.25.0", + "rollup-plugin-postcss": "^4.0.0", + "vite": "^5.1.4", + "vite-plugin-checker": "^0.6.4", + "vitest": "^1.3.1" + }, + "browserslist": { + "production": [">0.2%", "not dead", "not op_mini all"], + "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] + } + } + + + The following vite.config.js should be used as a starting point. + + + import { defineConfig, loadEnv } from "vite" + import react from "@vitejs/plugin-react" + import checker from "vite-plugin-checker" + import { resolve } from "path" + + // https://vitejs.dev/config/ + export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + + return { + base: "/", + build: { + outDir: "dist", + assetsDir: "assets", + commonjsOptions: { transformMixedEsModules: true }, + rollupOptions: { + output: { + manualChunks: { + vendor: ["react", "react-dom"], + graphai: ["graphai", "@graphai/vanilla", "@graphai/llm_agents"], + // Only include packages that are actually installed: + // mui: ['@mui/material', '@mui/icons-material', '@mui/x-data-grid'], + // charts: ['recharts'], + }, + }, + }, + }, + plugins: [ + react(), + checker({ + typescript: true, + eslint: { + lintCommand: "eslint", + }, + }), + ], + define: { + global: "globalThis", + }, + resolve: { + alias: { + "@": resolve(__dirname, "src"), + async_hooks: "async_hooks-browserify", + }, + }, + optimizeDeps: { + exclude: ["@graphai/agent_filters"], + }, + } + }) + + + You'll also need a src/vite-env.d.ts file: + + + /// + + interface ImportMetaEnv { + readonly VITE_USE_SERVER_AGENTS?: string; + readonly VITE_GRAPHAI_SERVER_URL?: string; + readonly VITE_OPENAI_API_KEY?: string; + } + + interface ImportMeta { + readonly env: ImportMetaEnv; + + + The following rollup.config.js should be used as a starting point. + + + import path from "path" + import { fileURLToPath } from "url" + import alias from "@rollup/plugin-alias" + import resolve from "@rollup/plugin-node-resolve" + import commonjs from "@rollup/plugin-commonjs" + import postcss from "rollup-plugin-postcss" + import json from "@rollup/plugin-json" + import sucrase from "@rollup/plugin-sucrase" + + // Convert import.meta.url to __dirname + const __filename = fileURLToPath(import.meta.url) + const __dirname = path.dirname(__filename) + + export default { + input: "src/main.tsx", + output: { + dir: "dist", + format: "iife", // Use 'iife' for a self-executing function suitable for browsers + name: "", // Name of the global variable for your app + sourcemap: true, + }, + plugins: [ + alias({ + entries: [{ find: "@", replacement: path.resolve(__dirname, "src") }], + }), + resolve({ + browser: true, // Ensure resolution of browser-compatible modules + preferBuiltins: false, // Disable Node.js built-ins + }), + commonjs({ + include: /node_modules/, // Include all dependencies in node_modules + requireReturnsDefault: "auto", // Attempt to automatically handle default exports + }), + json(), + postcss({ + extensions: [".css"], + }), + sucrase({ + exclude: ["node_modules/**", "**/*.css", "**/*.json"], + transforms: ["typescript", "jsx"], + }), + ], + context: "window", + watch: { + chunkSizeWarningLimit: 1000, + }, + } + + + The following tsconfig.json should be used as a starting point. + + + { + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ES2020", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": "src", + "paths": { + "@/*": ["./*"] + }, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Additional options for compatibility */ + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [{ "path": "./tsconfig.node.json" }] + } + + + The following tsconfig.node.json should be used as a starting point. + + + { + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ES2020", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true, + "allowJs": true + }, + "include": ["vite.config.*", "*.config.*"], + "exclude": ["node_modules", "dist"] + } + + + + ## GraphAI Integration + + This section demonstrates how to integrate GraphAI into a TypeScript application with environment-aware configuration. The service automatically adapts between local development and production environments using the environment variable management system. + + ### Important: React Import Configuration + + When using React 17+ with the new JSX transform, you should **NOT** import React directly in your components. Instead: + + **❌ Don't do this:** + + + import React, { useState } from "react" + + + **✅ Do this instead:** + + + import { useState } from "react" + + + **For main.tsx, use StrictMode directly:** + + + import { StrictMode } from 'react' + import ReactDOM from 'react-dom/client' + import App from './App' + + ReactDOM.createRoot(document.getElementById('root')!).render( + + + , + ) + + + ### Vite Environment Types + + Create a src/vite-env.d.ts file to properly configure TypeScript for Vite and React: + + + /// + /// + /// + + interface ImportMetaEnv { + readonly MODE: string + readonly BASE_URL: string + readonly PROD: boolean + readonly DEV: boolean + readonly VITE_USE_SERVER_AGENTS?: string + readonly VITE_GRAPHAI_SERVER_URL?: string + readonly VITE_OPENAI_API_KEY?: string + } + + interface ImportMeta { + readonly env: ImportMetaEnv + } + + + ### GraphAI Service Implementation + + + import { streamAgentFilterGenerator } from "@graphai/stream_agent_filter" + import { httpAgentFilter } from "@graphai/http_client_agent_filter" + import { GraphAI, AgentFunctionContext } from "graphai" + import { openAIAgent } from "@graphai/llm_agents" + import * as agents from "@graphai/vanilla" + import { fetchAgent } from "@graphai/service_agents" + import * as YAML from "yaml" + import { getAppConfig, AppConfig } from "../config/environment" + + // Define interfaces for your data and responses + interface DataItem { + id: string + name: string + category: string + metadata: Record + } + + interface GraphAIResponse { + success: boolean + result?: string + error?: string + } + + class GraphAIService { + private allAgents: any + private config: any + private workflow: any + private appConfig: AppConfig + + constructor() { + // Load environment configuration + this.appConfig = getAppConfig() + + // Create comprehensive agent collection + // Only include openAIAgent for local development + this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, + } + + // Create configuration for agents + // Only configure openAI for local development + this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } + + // Load the workflow + this.loadWorkflow() + } + + /** + * Load the GraphAI workflow from YAML file + */ + private async loadWorkflow(): Promise { + try { + const response = await fetch("/your-workflow.yaml") + const workflowContent = await response.text() + this.workflow = YAML.parse(workflowContent) + } catch (error) { + console.error("Failed to load workflow:", error) + } + } + + /** + * Format structured data for GraphAI workflows + * This demonstrates how to prepare any type of data for injection + */ + private formatDataCollection(items: DataItem[]): string { + return items + .map((item) => { + return \` + Item: \${item.name} (ID: \${item.id}) + Category: \${item.category} + Metadata: \${JSON.stringify(item.metadata, null, 2)} + ---\` + }) + .join("\n") + } + + /** + * Execute workflow with environment-aware configuration + */ + async executeGraphAI( + query: string, + data: DataItem[], + onStream: (response: string) => void, + ): Promise { + try { + // Ensure workflow is loaded + if (!this.workflow) { + await this.loadWorkflow() + } + + let lastNodeId: string | null = null + const streamCallback = (context: AgentFunctionContext, token: string) => { + console.log(token) + if (context.debugInfo.nodeId !== lastNodeId && lastNodeId !== null) { + onStream("\n\n") + } + lastNodeId = context.debugInfo.nodeId + onStream(token) + } + + // Agent filters for processing + const streamAgentFilter = streamAgentFilterGenerator(streamCallback) + + // Configure server agents based on environment + const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + + const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, + ] + + // Format your data for injection + const dataCollectionText = this.formatDataCollection(data) + + const graphai = new GraphAI(this.workflow, this.allAgents, { + agentFilters: agentFilters, + config: this.config, + }) + + // Inject values + graphai.injectValue("userPrompt", query) + graphai.injectValue("dataCollection", dataCollectionText) + + /* + CRITICAL: Use injectValue() to pass data into + your workflow. This allows you to inject any type of data: + structured data, images, files, etc. + + You can inject multiple types of data: + graphai.injectValue("imageData", base64ImageString); + graphai.injectValue("fileContent", fileContentString); + graphai.injectValue("contextData", JSON.stringify(contextObject)); + + Note that the static node type must match the injected data. + To inject an array object, the static node must look like: + + nodeName: + value: [] + */ + + // Logging with environment context + graphai.onLogCallback = ({ nodeId, agentId, state, errorMessage: errorMessage }) => { + if (!errorMessage) { + console.log( + \`\${nodeId} \${agentId} \${state} (\${this.appConfig.useServerAgents ? "server" : "local"})\`, + ) + } else { + console.log(\`ERROR: \${nodeId} \${agentId} \${state}: \${errorMessage}\`) + } + } + + const result = await graphai.run() + + return { + success: true, + result: this.formatGraphAIResult(result), + } + } catch (error) { + console.error("GraphAI error:", error) + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error occurred", + } + } + } + + /** + * Format GraphAI result for display + */ + private formatGraphAIResult(result: any): string { + if (result && typeof result === "object") { + const resultKeys = Object.keys(result) + if (resultKeys.length > 0) { + // Return the first result node's content + const firstKey = resultKeys[0] + const firstResult = result[firstKey] + + if (typeof firstResult === "string") { + return firstResult + } else if (firstResult && firstResult.text) { + return firstResult.text + } else { + return JSON.stringify(firstResult, null, 2) + } + } + } + + return typeof result === "string" ? result : JSON.stringify(result, null, 2) + } + + /** + * Get current configuration info for debugging + */ + getConfigInfo(): { environment: string; useServerAgents: boolean; serverUrl: string } { + return { + environment: this.appConfig.isProduction ? "production" : "development", + useServerAgents: this.appConfig.useServerAgents, + serverUrl: this.appConfig.graphaiServerUrl, + } + } + } + + const graphAIServiceInstance = new GraphAIService() + export default graphAIServiceInstance + + + ## Using the GraphAI Service in React + + Here's a minimal example showing how to import and use the GraphAI service in a React component: + + + import { useState, useCallback } from 'react'; + import graphaiService, { GraphAIResponse } from '../services/graphaiService'; + + const AIComponent: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + const [response, setResponse] = useState(''); + const [error, setError] = useState(''); + + // Your application data + const data: DataItem[] = []; // Replace with your actual data + + const handleQuery = useCallback(async (query: string) => { + if (!query.trim()) return; + + // Clear previous state before starting new query + setError(''); + setResponse(''); + setIsLoading(true); + + try { + // Track if we've received the first token to improve UX + let hasReceivedFirstToken = false; + + // Stream callback for real-time updates + const onStream = (token: string) => { + // Stop loading spinner as soon as first token arrives for better UX + // This allows users to see content appearing immediately + if (!hasReceivedFirstToken) { + hasReceivedFirstToken = true; + setIsLoading(false); + } + + setResponse(prev => prev + token); + }; + + // Execute GraphAI workflow + const result: GraphAIResponse = await graphaiService.executeGraphAI( + query, + data, + onStream + ); + + if (result.success && result.result) { + // Ensure final complete response is displayed + // This handles cases where streaming doesn't work or is incomplete + setResponse(result.result); + } else if (!result.success && result.error) { + setError(result.error); + setResponse(''); + } + } catch (error) { + console.error('GraphAI error:', error); + setError(error instanceof Error ? error.message : 'An unexpected error occurred'); + setResponse(''); + } finally { + // Always stop loading at the end as a safety net + setIsLoading(false); + } + }, [data]); + + return ( +
+ e.key === 'Enter' && handleQuery(e.currentTarget.value)} + placeholder="Ask anything..." + /> + + + {isLoading &&

Loading...

} + {error &&

{error}

} + {response && ( +
+ {response} + {isLoading && |} {/* Show cursor while streaming */} +
+ )} +
+ ); + }; +
+ + ## Environment Variable Management + + ### Overview + + The GraphAI application uses a sophisticated environment variable management system that adapts between local development and production deployment environments. Environment variables control how GraphAI agents are configured and whether they run locally or on remote servers. + + ### Environment Configuration Structure + + #### Key Environment Variables + + - **VITE_USE_SERVER_AGENTS**: Controls whether to use server-side GraphAI agents or local agents + - **VITE_GRAPHAI_SERVER_URL**: URL endpoint for the GraphAI server when using server agents + - **VITE_OPENAI_API_KEY**: OpenAI API key for local development (only used when not using server agents) + + #### Environment Detection Logic + + + const isProduction = import.meta.env.PROD + const useServerAgents = import.meta.env.VITE_USE_SERVER_AGENTS === "true" || isProduction + + const config = { + isProduction, + useServerAgents, + graphaiServerUrl: import.meta.env.VITE_GRAPHAI_SERVER_URL || "http://localhost:8085/agents", + openaiApiKey: useServerAgents ? undefined : import.meta.env.VITE_OPENAI_API_KEY, + } + + + ### GraphAI Service Integration + + This component automatically adapts its configuration based on environment variables: + + #### Agent Configuration + + + // Agent collection - same for all environments + this.allAgents = { + ...agents, + fetchAgent, + openAIAgent, + } + + // Configuration adapts based on environment + this.config = this.appConfig.useServerAgents + ? { + openAIAgent: { + stream: true, + }, + } + : { + openAIAgent: { + forWeb: true, + apiKey: this.appConfig.openaiApiKey, + stream: true, + }, + } + + + #### Server Agent Filtering + + When using server agents, the service configures HTTP agent filters to route specific agents to the remote server: + + + // Configure server agents based on environment + const serverAgents: string[] = this.appConfig.useServerAgents ? ["openAIAgent"] : [] + + const agentFilters = [ + { + name: "streamAgentFilter", + agent: streamAgentFilter, + }, + { + name: "httpAgentFilter", + agent: httpAgentFilter, + filterParams: { + server: { + baseUrl: this.appConfig.graphaiServerUrl, + }, + }, + agentIds: serverAgents, + }, + ] + + + ### Environment Files + + The application supports different environment configurations: + + - **Development**: Uses local OpenAI API key, agents run in browser + - **Production**: Uses server agents, no API key needed in browser + + #### Vite Configuration + + The [vite.config.js](wine-cellar-app/vite.config.js) automatically loads environment variables: + + + export default defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), "") + // Environment variables are automatically available as import.meta.env.* + }) + + + ### Debugging Environment Variables + + The environment configuration includes comprehensive logging for debugging: + + + console.log("=== Environment Variables Debug ===") + console.log("import.meta.env.PROD:", import.meta.env.PROD) + console.log("import.meta.env.DEV:", import.meta.env.DEV) + console.log("import.meta.env.MODE:", import.meta.env.MODE) + console.log("import.meta.env.VITE_USE_SERVER_AGENTS:", import.meta.env.VITE_USE_SERVER_AGENTS) + console.log("import.meta.env.VITE_GRAPHAI_SERVER_URL:", import.meta.env.VITE_GRAPHAI_SERVER_URL) + console.log("===================================") + + + Use the following defaults for your server configuration (both dev and prod deployments). + + + # Development/staging environment + # Use server-side GraphAI processing + VITE_USE_SERVER_AGENTS=true + VITE_GRAPHAI_SERVER_URL=https://graphai.dev.tne.ai/agents + `, + }, + { + slug: "graphai", + name: "🔄 GraphAI", + roleDefinition: + "You are TNE-Code, a GraphAI workflow specialist who develops sophisticated AI orchestration workflows. You understand GraphAI's declarative syntax, agent system, and advanced features like conditional logic, loops, parallel execution, and nested workflows. You only write GraphAI workflows, and don't write other types of code.", + groups: ["read", "edit", "command"], + customInstructions: `# GraphAI Tutorial + ## Hello World + + [GraphAI](https://github.com/receptron/graphai) is an open source project, which allows non-programmers to build AI applications by describing data flows in a declarative language, GraphAI. + + Here a simple example of GraphAI. + + + version: 0.5 + nodes: + llm1: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: Explain ML's transformer in 100 words. + isResult: true + llm2: + agent: openAIAgent + params: + model: gpt-4o + inputs: + system: Provide a a 50 word summary of your input. + prompt: :llm1.text + isResult: true + + + It has two nodes: + + 1. **llm1**: This node is associated with "openAIAgent", which calls OpenAI's chat completion API. It takes "Explain ML's transformer in 100 words." as an input (the user prompt) and outputs the result from the chat completion API. + 2. **llm2**: This node receives the output of the **llm2** node, as an input, and performs an additional LLM call to summarize tie 100 words down to 50. + + Notice that **llm1** node will be executed immediately because all the inputs are available at the beginning, while **llm2** node will be executed when the data from **llm1** node becomes available. If llm2 did not accept input from llm1, and instead had a prompt of :userPrompt, the two nodes would execute concurrently. + + Because isResult is set to true from **llm1** and **llm2**, both will display to the console. + + ## Computed Node and Static Node + + There are two types of nodes in GraphAI, _computed nodes_ and _static nodes_. + + A computed node is associated with an _agent_, which performs a certain computation. Both nodes in the previous examples are _computed nodes_. + + A _static nodes_ is a place holder of a value, just like a _variable_ in computer languages. + + In our organization, it is convention that a single message is passed into the LLM workflow by using a static node called userPrompt. Entire chat histories (represented by an array of OpenAI-style messages with a role and content) are passed in through the chatHistory static node. + + When creating a workflow that has a placeholder to accept user input in either of these forms, initialize an empty userPrompt and/or chatHistory node as follows. + + + nodes: + userPrompt: + value: "" + chatHistory: + value: [] + + + The example below performs a similar operation as the previous example, but uses one _static node_, **userPrompt**, which holds the value "Explain ML's transformer in 100 words". + + + version: 0.5 + nodes: + userPrompt: + value: Explain ML's transformer in 100 words. + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: :userPrompt + output: + agent: copyAgent + params: + namedKey: text + console: + after: true + inputs: + text: :llm.text + + + ## Loop / Mapping + + The dataflow graph needs to be acyclic by design, but we added a few control flow mechanisms, such as loop, nesting, if/unless and mapping (of map-reduce). Note the syntax to access :shift.item inside a string. + + ### Loop + + Here is a simple application, which uses **loop**. + + + version: 0.5 + loop: + while: :fruits + nodes: + fruits: + value: + - apple + - lemon + - banana + update: :shift.array + result: + value: [] + update: :reducer.array + isResult: true + shift: + agent: shiftAgent + inputs: + array: :fruits + llm: + agent: openAIAgent + params: + model: gpt-4o + inputs: + prompt: What is the typical color of \${:shift.item}? Just answer the color. + isResult: true + reducer: + agent: pushAgent + inputs: + array: :result + item: :llm.text + + + + 1. **fruits**: This static node holds the list of fruits at the beginning but updated with the array property of **shift** node after each iteration. + 2. **result**: This static node starts with an empty array, but updated with the value of **reducer** node after each iteration. + 3. **shift**: This node takes the first item from the value from **fruits** node, and output the remaining array and item as properties. + 4. **llm**: This computed node generates a prompt using the template "What is the typical color of \${:shift.item}? Just answer the color." by applying the item property from the shift node's output. It then passes this prompt to gpt-4o to obtain the generated result. + 5. **reducer**: This node pushes the content from the output of **llm** node to the value of **result** node. + + Please notice that each item in the array will be processed sequentially. To process them concurrently, see the section below. + + ## Parallel Execution + S3 File Access + + This example uses s3FileAgent to access images in S3. In this case, the images contain tabular data, and mapAgent is used to perform OCR in parallel for each image. The extracted tables from each image are combined into a single result. + + Use mapAgent for processes which take a list as input, when the objective is to process all list items concurrently. Use a traditional loop for iterative processing. + + + version: 0.5 + nodes: + imageData1: + agent: s3FileAgent + params: + fileName: image input 1.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData2: + agent: s3FileAgent + params: + fileName: image input 2.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageData3: + agent: s3FileAgent + params: + fileName: image input 3.jpg + bucket: bp-authoring-files + region: us-west-2 + inputs: {} + imageExtractor: + agent: mapAgent + inputs: + rows: + - ":imageData1.imageData" + - ":imageData2.imageData" + - ":imageData3.imageData" + params: {} + graph: + version: 0.5 + nodes: + imageExtraction: + agent: openAIAgent + inputs: + messages: + - role: user + content: + - type: image_url + image_url: + url: "\${:row}" + system: From the given image(s), extract the tabular data in a CSV format. + console: true + filterExtraction: + agent: copyAgent + inputs: + text: ":imageExtraction.text" + params: + namedKey: text + isResult: true + console: true + aggregateImageExtraction: + agent: jsonParserAgent + inputs: + data: ":imageExtractor" + console: true + synthesizeLlm: + agent: openAIAgent + inputs: + prompt: ":aggregateImageExtraction.text" + system: From the given list, synthesize all tabular data into one or more tables + isResult: true + console: true + + + ## Nested Workflows + Conditional Logic + + ### Nesting + + A node can itself be a GraphAI workflow, which is executed through nestedAgent. The following example uses fetchAgent to pull documentation from the given URLs, then generates a GraphAI workflow, which is executed through the use of nestedAgent. + + ### Conditional logic + + Computed nodes can execute upon a condition being met using if/unless syntax and compareAgent. In this example, the fetchAPI node returns True if the user is asking a question that may require external APIs (like the current weather), otherwise False if it can be answered with general knowledge. The checkAPICallNeeded node evaluates to True if the fetchAPI.text value is not False. Nodes can now use if/unless syntax to conditionally execute based off of this evaluation. + + + version: 0.5 + nodes: + userPrompt: + value: "" + + llmEngine: + value: "openAIAgent" + + fetchAPI: + agent: ":llmEngine" + inputs: + prompt: ":userPrompt" + system: >- + You are capable of either returning True or False. Return True if the user is asking for information which would require external knowledge, and False otherwise. + + checkAPICallNeeded: + agent: compareAgent + inputs: + array: [":fetchAPI.text", "!=", "False"] + + conversationLLM: + agent: ":llmEngine" + inputs: + system: You are a helpful chat assistant. + prompt: ":userPrompt" + unless: ":checkAPICallNeeded.result" + isResult: true + + document: + agent: fetchAgent + console: + before: "...fetching document" + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/main/packages/graphai/README.md + + sampleGraph: + agent: fetchAgent + params: + type: text + inputs: + url: https://raw.githubusercontent.com/receptron/graphai/refs/heads/main/packages/samples/src/net/weather.ts + + graphGenerator: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - >- + You an expert in GraphAI programming. You are responsible in generating a graphAI graph to answer the user question. Always store the results in a node called 'output', with isResult set to true. + - "graphAI graph outputs in json format" + - "[documentation of GraphAI]\n\${:document}" + - "[sample graph]\n\`\`\`json\n\${:sampleGraph}\n\`\`\`" + - "For weather, directly input the latitude/longitude into the GraphAI graph you write" + params: + temperature: 0 + isResult: true + + execute: + if: ":checkAPICallNeeded.result" + agent: nestedAgent + graph: ":graphGenerator.text.codeBlock().jsonParse()" + + summarize: + agent: ":llmEngine" + if: ":checkAPICallNeeded.result" + inputs: + prompt: ":userPrompt" + system: + - "Output to summarize:\n\n" + - ":execute.output" + - "Instructions\n\n" + - "Succinctly summarize the data you've received to answer the user question in the chat history." + isResult: true + `, + }, + { + slug: "deploy", + name: "🚀 Deploy", + roleDefinition: + "You are TNE-Code, a deployment specialist who automates application deployment using the tne-ci-mcp server. You understand AWS S3, Kubernetes, and the TNE infrastructure for both development and production environments.", + groups: ["read", "command", "mcp"], + customInstructions: `## Deployment with tne-ci-mcp Server + + ### Overview + + Deployment is handled through the **tne-ci-mcp** MCP server, which provides automated deployment tools for AWS S3 and Kubernetes. If not available, alert the user that it must be installed [here](https://github.com/tne-ai/tne-ci-mcp). + + ### Available MCP Tools + + The tne-ci-mcp server provides three main deployment tools: + + #### 1. deploy-app + + Deploys the application to AWS S3 and sets up Kubernetes routing. + + #### 2. cleanup-app + + Removes all deployed resources from AWS and Kubernetes. + + #### 3. check-deployment-status + + Checks the current deployment status across environments. + + ### Deployment Architecture + + #### Domain Structure + + - **Development**: {app-name}.dev.tne.ai + - **Production**: {app-name}.tne.ai + + #### Infrastructure Components + + - **S3 Bucket**: Static website hosting with public read access + - **VirtualService**: Routes custom domain to S3 website endpoint + - **ServiceEntry**: Allows Istio to route to external S3 endpoint + - **Shared Ingress Gateway**: Handles SSL termination and routing + + By default, deploy to dev. If the user asks, deploy to prod after dev. + + ### Prerequisites + + Before using the MCP deployment tools, ensure: + + 1. **AWS CLI** configured with appropriate permissions + 2. **kubectl** connected to your Kubernetes cluster + 3. **Node.js & npm** for building the application + 4. **tne-ci-mcp server** connected and available + + #### Common Issues + + 1. **MCP Server Connection**: Ensure tne-ci-mcp server is running and connected + 2. **AWS Permissions**: Verify AWS CLI has S3, CloudFront, and Route 53 permissions + 3. **Kubernetes Access**: Check kubectl connection and namespace permissions + 4. **Build Failures**: Ensure Node.js dependencies are installed and environment variables are set`, + }, + { + slug: "tne-product-research", + name: "🔍TNE1. Product Research", + roleDefinition: "You are TNE-Code, an expert in the listed TOPIC or APPLICATION.", + whenToUse: + "This is the first phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "DO NOT RELY ON INTERNAL KNOWLEDGE. SEARCH AND CRAWL THE INTERNET. Cite each reference to a repo or a paper. Check that it is correct. \n\n## THE PROCESS\nYour Process. Save this information to memory_bank/tne-product-research.md\n\n0. Explain the APPLICATION or TOPIC\n0.5. Determine the business reuquirements and needs for the APPLICATION\n1. What are the best techniques for AI techniques for the APPLICATION \n2. What are the best open source models for this. Can multimodal LLMs be used for this? \n2a. What out of the box models can I use that are on github? \n3. What are the best proprietary or cloud systems to be considered \n4. What are some research papers that discuss the state of the art of APPLICATION? Use Arxiv to search for relevant and popular recent papers and INCLUDE ARXIV CITATION link and check it\n5. What is the best way to use an ensemble of these techniques and will this improve reliability, consistency, accuracy or other parameters. \n6. What are standard datasets to test APPLICATION. And what are standard metrics\n6a. Look at competitive products in the category focus on open source but also do the top closed source ones. Make a chart of features for each and make sure whatever we build includes those featurees\n6a. how can open source models be used together, how are they built and how can they be integrated. Are they libraries, standalone servers.\n7. add urls to all the sources and references. Include linnks for all proprietary products mentioned, Make sure each github, researchgate, and other links are valid. \n\n\nWhen user is satisfied ask if it done and start the tne-report-reco mode", + }, + { + slug: "tne-report-reco", + name: "📊TNE2. Technical Reports", + roleDefinition: + "You are an expert in making reports, weighing pros and cons of options and making recommendations on the TOPIC or APPLICATION listed.", + whenToUse: + "This is the second phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "For the named APPLICATION or TOPIC\n\nRead all the files in ./memory_bank\n\nYour process is \n1. Ingest Research in context or in ./memory_bank/tne-product-research.md\n1a. Do additional research if you need to. DO NOT USE INTERNAL DATA. Make sure to check each reference that it exists on the Internet and cite the url\n2. Create 3 point summary and 2-5 page recommendation to be sent to a customer on the TOPIC\n3. Write a 6 slide PowerPoint deck explaining with bullets points and subtitle and mermaid diagrams showing the solution\n4. Write a highly detailed tutorial for non-technical beginners and business value explanation for all technical terms and concepts put into ./memory_bank/tne-terms-and-concepts.md\n\nFOR EVERY FACT, QUOTE, STATISTIC, ARTICLE or GITHUB repo add a url and check that it is corrects\n\nWhen the user is satisfied change the mode to tne-business-decisions and continue", + }, + { + slug: "tne-business-decisions", + name: "💼TNE3. Business Memos", + roleDefinition: + "You are a business analyst who is taking the research and recommendations and making it easy for lay people and business decision makers to understand the choices and recommend what they should do", + whenToUse: + "This is the third phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "Analyze memory_bank/tne-*.md, and expand into ./memory_bank/tne-business-memo.md\n\nWith the purpose\n1. Tune the explanation not-technical and business decisionmakers people\n2. Top level summaries \n3. Turn all bullet points into professional tone paragraphs\n4. 5 pages of recommendations\n5. Create an extensive business orient powerpoint deck with mermaid diagrams and charts\n\nKeep asking questions until user satisfied then switch to Mode TNE4", + }, + { + slug: "tne-project-brief", + name: "🏗️TNE4. Project Brief", + roleDefinition: + "Your job as a project manager is to create the ./memory-bank/projectbrief.md to explain to the technical team what to build", + whenToUse: + "This is the fourth phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "use data in ./memory-bank to create ./memory-bank/projectbrief.md\n\nMake sure to include:\n1. Project Overview\n2. Core purpose\n3. Key Requirements: including functional and technial\n4. Target Users\n5. Success Criteria\n6. Deliverables\n\nfor each citation, github repo or fact, provide a url and check it to make sure it is correct for all documents in ./memory-bank/tne*.md\n\nWhen user is satisfied switch to Architect Mode and continue", + }, + { + slug: "tne-skeptic", + name: "🤔TNE5. Skeptic", + roleDefinition: "You are a cynical skeptical auditor making sure every fact is cited and every url checked", + whenToUse: + "This is the fifth phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "Make sure that all Markdown, Presentations and documents are correct. Rewrite every file as needed\n\n1. Make sure every fact has a citation\n2. Every citation has a URL and link\n3. That the URL is correct and valid\n\nWhen done go to the next step in the TNE process.", + }, + { + slug: "tne-customer-presentation", + name: "✨TNE6. Customer Presentations", + roleDefinition: + "Expert in PowerPoint Presentations and graphics to explain complex projects to business and high level technical people", + whenToUse: + "This is the sixth phase in planning a project\n\ntne-product-research --> tne-report-reco --> tne-business-decisions --> tne-project-brief --> tne-skeptic --> tne-customer-presentation6", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "This APPLICATION is build by our COMPANY (TNE.ai)\n\nPresentation should be professional and business like. High quality graphics and illustrations. Display the presentation and keep asking user for feedback until they are statisfied.\n\n\nInclude many diagrams, conceptual blocks to make it easy to understand for business decision-makers and high level technical decisionmakers with some understanding of high level AI only.\n\nUse high resolution SVG diagrams, with high resolution icons that illustrate the blocks\n\nBreak the presentation up into individual web pages. Have a central page with central CSS and navigation\n\nUSE 16:9 Aspect RAtio for each slide\n\n\n do not make unsubstantiated claims, \n\nThe presentation should include (and if the content will not fit in one slide, create extra slides as needed) for these sections:\n\n1. The Business Problem being solves\n2. The technical solutions and its benefits\n3. Explain why now\n4. Explain what is the Unique Selling Proposition and Technical advantage of the company\n5. Explain how the system works\n6. Leave room for a demonstration\n7. Explain the next steps: Paid POC --> Proof of Value --> Rollout\n8. Write out the presentation in MD, HTML and export to PPTX\n\nWhen done go to the next step in the TNE process.", + }, ] as const // Export the default mode slug diff --git a/src/shared/tools.ts b/src/shared/tools.ts index 85a0cb318c..2832515560 100644 --- a/src/shared/tools.ts +++ b/src/shared/tools.ts @@ -62,6 +62,8 @@ export const toolParamNames = [ "start_line", "end_line", "query", + "chatHistory", + "userPrompt", ] as const export type ToolParamName = (typeof toolParamNames)[number] @@ -161,6 +163,11 @@ export interface SearchAndReplaceToolUse extends ToolUse { Partial, "use_regex" | "ignore_case" | "start_line" | "end_line">> } +export interface RunGraphaiToolUse extends ToolUse { + name: "run_graphai" + params: Partial, "path" | "chatHistory" | "userPrompt">> +} + // Define tool group configuration export type ToolGroupConfig = { tools: readonly string[] @@ -186,6 +193,7 @@ export const TOOL_DISPLAY_NAMES: Record = { insert_content: "insert content", search_and_replace: "search and replace", codebase_search: "codebase search", + run_graphai: "run graphai workflows", } as const // Define available tool groups. @@ -207,7 +215,7 @@ export const TOOL_GROUPS: Record = { tools: ["browser_action"], }, command: { - tools: ["execute_command"], + tools: ["execute_command", "run_graphai"], }, mcp: { tools: ["use_mcp_tool", "access_mcp_resource"], diff --git a/src/turbo.json b/src/turbo.json index d4b2ab3ffd..a2c5232288 100644 --- a/src/turbo.json +++ b/src/turbo.json @@ -3,7 +3,7 @@ "extends": ["//"], "tasks": { "bundle": { - "dependsOn": ["^build", "@roo-code/vscode-webview#build"], + "dependsOn": ["^build", "@tne-code/vscode-webview#build"], "outputs": ["dist/**"] }, "vsix": { @@ -12,7 +12,7 @@ "outputs": ["../bin/**"] }, "watch:bundle": { - "dependsOn": ["@roo-code/build#build", "@roo-code/types#build"], + "dependsOn": ["@tne-code/build#build", "@tne-code/types#build"], "cache": false } } diff --git a/webview-ui/eslint.config.mjs b/webview-ui/eslint.config.mjs index db76f49211..7b96856ab6 100644 --- a/webview-ui/eslint.config.mjs +++ b/webview-ui/eslint.config.mjs @@ -1,4 +1,4 @@ -import { reactConfig } from "@roo-code/config-eslint/react" +import { reactConfig } from "@tne-code/config-eslint/react" /** @type {import("eslint").Linter.Config} */ export default [ diff --git a/webview-ui/src/i18n/locales/en/account.json b/webview-ui/src/i18n/locales/en/account.json index 7833471eb2..77c17716ea 100644 --- a/webview-ui/src/i18n/locales/en/account.json +++ b/webview-ui/src/i18n/locales/en/account.json @@ -4,5 +4,5 @@ "unknownUser": "Unknown User", "logOut": "Log out", "testApiAuthentication": "Test API Authentication", - "signIn": "Connect to Roo Code Cloud" + "signIn": "Connect to TNE-Code Cloud" } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 156ca523ee..65133b5c70 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Welcome to Roo Code", + "greeting": "Welcome to TNE-Code", "task": { "title": "Task", "seeMore": "See more", @@ -146,54 +146,54 @@ "tokens": "tokens" }, "instructions": { - "wantsToFetch": "Roo wants to fetch detailed instructions to assist with the current task" + "wantsToFetch": "TNE-Code wants to fetch detailed instructions to assist with the current task" }, "fileOperations": { - "wantsToRead": "Roo wants to read this file:", - "wantsToReadMultiple": "Roo wants to read multiple files:", - "wantsToReadAndXMore": "Roo wants to read this file and {{count}} more:", - "wantsToReadOutsideWorkspace": "Roo wants to read this file outside of the workspace:", - "didRead": "Roo read this file:", - "wantsToEdit": "Roo wants to edit this file:", - "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace:", - "wantsToCreate": "Roo wants to create a new file:", - "wantsToSearchReplace": "Roo wants to search and replace in this file:", - "didSearchReplace": "Roo performed search and replace on this file:", - "wantsToInsert": "Roo wants to insert content into this file:", - "wantsToInsertWithLineNumber": "Roo wants to insert content into this file at line {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo wants to append content to the end of this file:" + "wantsToRead": "TNE-Code wants to read this file:", + "wantsToReadMultiple": "TNE-Code wants to read multiple files:", + "wantsToReadAndXMore": "TNE-Code wants to read this file and {{count}} more:", + "wantsToReadOutsideWorkspace": "TNE-Code wants to read this file outside of the workspace:", + "didRead": "TNE-Code read this file:", + "wantsToEdit": "TNE-Code wants to edit this file:", + "wantsToEditOutsideWorkspace": "TNE-Code wants to edit this file outside of the workspace:", + "wantsToCreate": "TNE-Code wants to create a new file:", + "wantsToSearchReplace": "TNE-Code wants to search and replace in this file:", + "didSearchReplace": "TNE-Code performed search and replace on this file:", + "wantsToInsert": "TNE-Code wants to insert content into this file:", + "wantsToInsertWithLineNumber": "TNE-Code wants to insert content into this file at line {{lineNumber}}:", + "wantsToInsertAtEnd": "TNE-Code wants to append content to the end of this file:" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo wants to view the top level files in this directory:", - "didViewTopLevel": "Roo viewed the top level files in this directory:", - "wantsToViewRecursive": "Roo wants to recursively view all files in this directory:", - "didViewRecursive": "Roo recursively viewed all files in this directory:", - "wantsToViewDefinitions": "Roo wants to view source code definition names used in this directory:", - "didViewDefinitions": "Roo viewed source code definition names used in this directory:", - "wantsToSearch": "Roo wants to search this directory for {{regex}}:", - "didSearch": "Roo searched this directory for {{regex}}:" + "wantsToViewTopLevel": "TNE-Code wants to view the top level files in this directory:", + "didViewTopLevel": "TNE-Code viewed the top level files in this directory:", + "wantsToViewRecursive": "TNE-Code wants to recursively view all files in this directory:", + "didViewRecursive": "TNE-Code recursively viewed all files in this directory:", + "wantsToViewDefinitions": "TNE-Code wants to view source code definition names used in this directory:", + "didViewDefinitions": "TNE-Code viewed source code definition names used in this directory:", + "wantsToSearch": "TNE-Code wants to search this directory for {{regex}}:", + "didSearch": "TNE-Code searched this directory for {{regex}}:" }, "codebaseSearch": { - "wantsToSearch": "Roo wants to search the codebase for {{query}}:", - "wantsToSearchWithPath": "Roo wants to search the codebase for {{query}} in {{path}}:", + "wantsToSearch": "TNE-Code wants to search the codebase for {{query}}:", + "wantsToSearchWithPath": "TNE-Code wants to search the codebase for {{query}} in {{path}}:", "didSearch": "Found {{count}} result(s) for {{query}}:" }, "commandOutput": "Command Output", "response": "Response", "arguments": "Arguments", "mcp": { - "wantsToUseTool": "Roo wants to use a tool on the {{serverName}} MCP server:", - "wantsToAccessResource": "Roo wants to access a resource on the {{serverName}} MCP server:" + "wantsToUseTool": "TNE-Code wants to use a tool on the {{serverName}} MCP server:", + "wantsToAccessResource": "TNE-Code wants to access a resource on the {{serverName}} MCP server:" }, "modes": { - "wantsToSwitch": "Roo wants to switch to {{mode}} mode", - "wantsToSwitchWithReason": "Roo wants to switch to {{mode}} mode because: {{reason}}", - "didSwitch": "Roo switched to {{mode}} mode", - "didSwitchWithReason": "Roo switched to {{mode}} mode because: {{reason}}" + "wantsToSwitch": "TNE-Code wants to switch to {{mode}} mode", + "wantsToSwitchWithReason": "TNE-Code wants to switch to {{mode}} mode because: {{reason}}", + "didSwitch": "TNE-Code switched to {{mode}} mode", + "didSwitchWithReason": "TNE-Code switched to {{mode}} mode because: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo wants to create a new subtask in {{mode}} mode:", - "wantsToFinish": "Roo wants to finish this subtask", + "wantsToCreate": "TNE-Code wants to create a new subtask in {{mode}} mode:", + "wantsToFinish": "TNE-Code wants to finish this subtask", "newTaskContent": "Subtask Instructions", "completionContent": "Subtask Completed", "resultContent": "Subtask Results", @@ -201,25 +201,25 @@ "completionInstructions": "Subtask completed! You can review the results and suggest any corrections or next steps. If everything looks good, confirm to return the result to the parent task." }, "questions": { - "hasQuestion": "Roo has a question:" + "hasQuestion": "TNE-Code has a question:" }, "taskCompleted": "Task Completed", "error": "Error", "diffError": { "title": "Edit Unsuccessful" }, - "troubleMessage": "Roo is having trouble...", + "troubleMessage": "TNE-Code is having trouble...", "powershell": { "issues": "It seems like you're having Windows PowerShell issues, please see this" }, "autoApprove": { "title": "Auto-approve:", "none": "None", - "description": "Auto-approve allows Roo Code to perform actions without asking for permission. Only enable for actions you fully trust. More detailed configuration available in Settings." + "description": "Auto-approve allows TNE-Code to perform actions without asking for permission. Only enable for actions you fully trust. More detailed configuration available in Settings." }, "announcement": { - "title": "🎉 Roo Code {{version}} Released", - "description": "Roo Code {{version}} brings powerful new features and improvements based on your feedback.", + "title": "🎉 TNE-Code {{version}} Released", + "description": "TNE-Code {{version}} brings powerful new features and improvements based on your feedback.", "whatsNew": "What's New", "feature1": "Intelligent Context Condensing Enabled by Default: Context condensing is now enabled by default with configurable settings for when automatic condensing happens", "feature2": "Manual Condensing Button: New button in the task header allows you to manually trigger context condensing at any time", @@ -235,7 +235,7 @@ "copyToInput": "Copy to input (same as shift + click)" }, "browser": { - "rooWantsToUse": "Roo wants to use the browser:", + "rooWantsToUse": "TNE-Code wants to use the browser:", "consoleLogs": "Console Logs", "noNewLogs": "(No new logs)", "screenshot": "Browser screenshot", @@ -269,13 +269,13 @@ "profileViolationWarning": "The current profile violates your organization's settings", "shellIntegration": { "title": "Command Execution Warning", - "description": "Your command is being executed without VSCode terminal shell integration. To suppress this warning you can disable shell integration in the Terminal section of the Roo Code settings or troubleshoot VSCode terminal integration using the link below.", + "description": "Your command is being executed without VSCode terminal shell integration. To suppress this warning you can disable shell integration in the Terminal section of the TNE-Code settings or troubleshoot VSCode terminal integration using the link below.", "troubleshooting": "Click here for shell integration documentation." }, "ask": { "autoApprovedRequestLimitReached": { "title": "Auto-Approved Request Limit Reached", - "description": "Roo has reached the auto-approved limit of {{count}} API request(s). Would you like to reset the count and proceed with the task?", + "description": "TNE-Code has reached the auto-approved limit of {{count}} API request(s). Would you like to reset the count and proceed with the task?", "button": "Reset and Continue" } } diff --git a/webview-ui/src/i18n/locales/en/mcp.json b/webview-ui/src/i18n/locales/en/mcp.json index 6136ed9b1d..9eaf92ec2a 100644 --- a/webview-ui/src/i18n/locales/en/mcp.json +++ b/webview-ui/src/i18n/locales/en/mcp.json @@ -1,16 +1,16 @@ { "title": "MCP Servers", "done": "Done", - "description": "The <0>Model Context Protocol enables communication with locally running MCP servers that provide additional tools and resources to extend Roo's capabilities. You can use <1>community-made servers or ask Roo to create new tools specific to your workflow (e.g., \"add a tool that gets the latest npm docs\").", + "description": "The <0>Model Context Protocol enables communication with locally running MCP servers that provide additional tools and resources to extend TNE-Code's capabilities. You can use <1>community-made servers or ask TNE-Code to create new tools specific to your workflow (e.g., \"add a tool that gets the latest npm docs\").", "instructions": "Instructions", "enableToggle": { "title": "Enable MCP Servers", - "description": "Turn this ON to let Roo use tools from connected MCP servers. This gives Roo more capabilities. If you don't plan to use these extra tools, turn it OFF to help reduce API token costs." + "description": "Turn this ON to let TNE-Code use tools from connected MCP servers. This gives TNE-Code more capabilities. If you don't plan to use these extra tools, turn it OFF to help reduce API token costs." }, "enableServerCreation": { "title": "Enable MCP Server Creation", - "description": "Enable this to have Roo help you build <1>new custom MCP servers. <0>Learn about server creation", - "hint": "Hint: To reduce API token costs, disable this setting when you are not actively asking Roo to create a new MCP server." + "description": "Enable this to have TNE-Code help you build <1>new custom MCP servers. <0>Learn about server creation", + "hint": "Hint: To reduce API token costs, disable this setting when you are not actively asking TNE-Code to create a new MCP server." }, "editGlobalMCP": "Edit Global MCP", "editProjectMCP": "Edit Project MCP", diff --git a/webview-ui/src/i18n/locales/en/prompts.json b/webview-ui/src/i18n/locales/en/prompts.json index f03d48ca92..510c53a921 100644 --- a/webview-ui/src/i18n/locales/en/prompts.json +++ b/webview-ui/src/i18n/locales/en/prompts.json @@ -7,7 +7,7 @@ "editModesConfig": "Edit modes configuration", "editGlobalModes": "Edit Global Modes", "editProjectModes": "Edit Project Modes (.roomodes)", - "createModeHelpText": "Modes are specialized personas that tailor Roo's behavior. <0>Learn about Using Modes or <1>Customizing Modes.", + "createModeHelpText": "Modes are specialized personas that tailor TNE-Code's behavior. <0>Learn about Using Modes or <1>Customizing Modes.", "selectMode": "Search modes" }, "apiConfiguration": { @@ -32,7 +32,7 @@ "roleDefinition": { "title": "Role Definition", "resetToDefault": "Reset to default", - "description": "Define Roo's expertise and personality for this mode. This description shapes how Roo presents itself and approaches tasks." + "description": "Define TNE-Code's expertise and personality for this mode. This description shapes how TNE-Code presents itself and approaches tasks." }, "whenToUse": { "title": "When to Use (optional)", @@ -70,7 +70,7 @@ "types": { "ENHANCE": { "label": "Enhance Prompt", - "description": "Use prompt enhancement to get tailored suggestions or improvements for your inputs. This ensures Roo understands your intent and provides the best possible responses. Available via the ✨ icon in chat." + "description": "Use prompt enhancement to get tailored suggestions or improvements for your inputs. This ensures TNE-Code understands your intent and provides the best possible responses. Available via the ✨ icon in chat." }, "EXPLAIN": { "label": "Explain Code", @@ -135,7 +135,7 @@ }, "roleDefinition": { "label": "Role Definition", - "description": "Define Roo's expertise and personality for this mode." + "description": "Define TNE-Code's expertise and personality for this mode." }, "whenToUse": { "label": "When to Use (optional)", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index ef559763db..4e7875df14 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -31,15 +31,15 @@ "prompts": "Prompts", "experimental": "Experimental", "language": "Language", - "about": "About Roo Code" + "about": "About TNE-Code" }, "prompts": { - "description": "Configure support prompts that are used for quick actions like enhancing prompts, explaining code, and fixing issues. These prompts help Roo provide better assistance for common development tasks." + "description": "Configure support prompts that are used for quick actions like enhancing prompts, explaining code, and fixing issues. These prompts help TNE-Code provide better assistance for common development tasks." }, "codeIndex": { "title": "Codebase Indexing", "enableLabel": "Enable Codebase Indexing", - "enableDescription": "<0>Codebase Indexing is an experimental feature that creates a semantic search index of your project using AI embeddings. This enables Roo Code to better understand and navigate large codebases by finding relevant code based on meaning rather than just keywords.", + "enableDescription": "<0>Codebase Indexing is an experimental feature that creates a semantic search index of your project using AI embeddings. This enables TNE-Code to better understand and navigate large codebases by finding relevant code based on meaning rather than just keywords.", "providerLabel": "Embeddings Provider", "selectProviderPlaceholder": "Select provider", "openaiProvider": "OpenAI", @@ -67,13 +67,13 @@ } }, "autoApprove": { - "description": "Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.", + "description": "Allow TNE-Code to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.", "readOnly": { "label": "Read", - "description": "When enabled, Roo will automatically view directory contents and read files without requiring you to click the Approve button.", + "description": "When enabled, TNE-Code will automatically view directory contents and read files without requiring you to click the Approve button.", "outsideWorkspace": { "label": "Include files outside workspace", - "description": "Allow Roo to read files outside the current workspace without requiring approval." + "description": "Allow TNE-Code to read files outside the current workspace without requiring approval." } }, "write": { @@ -82,7 +82,7 @@ "delayLabel": "Delay after writes to allow diagnostics to detect potential problems", "outsideWorkspace": { "label": "Include files outside workspace", - "description": "Allow Roo to create and edit files outside the current workspace without requiring approval." + "description": "Allow TNE-Code to create and edit files outside the current workspace without requiring approval." } }, "browser": { @@ -224,13 +224,13 @@ "draftModelDesc": "Draft model must be from the same model family for speculative decoding to work correctly.", "selectDraftModel": "Select Draft Model", "noModelsFound": "No draft models found. Please ensure LM Studio is running with Server Mode enabled.", - "description": "LM Studio allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide. You will also need to start LM Studio's local server feature to use it with this extension. Note: Roo Code uses complex prompts and works best with Claude models. Less capable models may not work as expected." + "description": "LM Studio allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide. You will also need to start LM Studio's local server feature to use it with this extension. Note: TNE-Code uses complex prompts and works best with Claude models. Less capable models may not work as expected." }, "ollama": { "baseUrl": "Base URL (optional)", "modelId": "Model ID", "description": "Ollama allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide.", - "warning": "Note: Roo Code uses complex prompts and works best with Claude models. Less capable models may not work as expected." + "warning": "Note: TNE-Code uses complex prompts and works best with Claude models. Less capable models may not work as expected." }, "unboundApiKey": "Unbound API Key", "getUnboundApiKey": "Get Unbound API Key", @@ -248,7 +248,7 @@ } }, "customModel": { - "capabilities": "Configure the capabilities and pricing for your custom OpenAI-compatible model. Be careful when specifying the model capabilities, as they can affect how Roo Code performs.", + "capabilities": "Configure the capabilities and pricing for your custom OpenAI-compatible model. Be careful when specifying the model capabilities, as they can affect how TNE-Code performs.", "maxTokens": { "label": "Max Output Tokens", "description": "Maximum number of tokens the model can generate in a response. (Specify -1 to allow the server to set the max tokens.)" @@ -304,7 +304,7 @@ "browser": { "enable": { "label": "Enable browser tool", - "description": "When enabled, Roo can use a browser to interact with websites when using models that support computer use. <0>Learn more" + "description": "When enabled, TNE-Code can use a browser to interact with websites when using models that support computer use. <0>Learn more" }, "viewport": { "label": "Viewport size", @@ -332,18 +332,18 @@ "checkpoints": { "enable": { "label": "Enable automatic checkpoints", - "description": "When enabled, Roo will automatically create checkpoints during task execution, making it easy to review changes or revert to earlier states. <0>Learn more" + "description": "When enabled, TNE-Code will automatically create checkpoints during task execution, making it easy to review changes or revert to earlier states. <0>Learn more" } }, "notifications": { "sound": { "label": "Enable sound effects", - "description": "When enabled, Roo will play sound effects for notifications and events.", + "description": "When enabled, TNE-Code will play sound effects for notifications and events.", "volumeLabel": "Volume" }, "tts": { "label": "Enable text-to-speech", - "description": "When enabled, Roo will read aloud its responses using text-to-speech.", + "description": "When enabled, TNE-Code will read aloud its responses using text-to-speech.", "speedLabel": "Speed" } }, @@ -351,7 +351,7 @@ "description": "Control what information is included in the AI's context window, affecting token usage and response quality", "autoCondenseContextPercent": { "label": "Threshold to trigger intelligent context condensing", - "description": "When the context window reaches this threshold, Roo will automatically condense it." + "description": "When the context window reaches this threshold, TNE-Code will automatically condense it." }, "condensingApiConfiguration": { "label": "API Configuration for Context Condensing", @@ -386,7 +386,7 @@ }, "maxReadFile": { "label": "File read auto-truncate threshold", - "description": "Roo reads this number of lines when the model omits start/end values. If this number is less than the file's total, Roo generates a line number index of code definitions. Special cases: -1 instructs Roo to read the entire file (without indexing), and 0 instructs it to read no lines and provides line indexes only for minimal context. Lower values minimize initial context usage, enabling precise subsequent line-range reads. Explicit start/end requests are not limited by this setting.", + "description": "TNE-Code reads this number of lines when the model omits start/end values. If this number is less than the file's total, TNE-Code generates a line number index of code definitions. Special cases: -1 instructs TNE-Code to read the entire file (without indexing), and 0 instructs it to read no lines and provides line indexes only for minimal context. Lower values minimize initial context usage, enabling precise subsequent line-range reads. Explicit start/end requests are not limited by this setting.", "lines": "lines", "always_full_read": "Always read entire file" } @@ -448,7 +448,7 @@ "advanced": { "diff": { "label": "Enable editing through diffs", - "description": "When enabled, Roo will be able to edit files more quickly and will automatically reject truncated full-file writes. Works best with the latest Claude 3.7 Sonnet model.", + "description": "When enabled, TNE-Code will be able to edit files more quickly and will automatically reject truncated full-file writes. Works best with the latest Claude 3.7 Sonnet model.", "strategy": { "label": "Diff strategy", "options": { @@ -475,23 +475,23 @@ }, "SEARCH_AND_REPLACE": { "name": "Use experimental search and replace tool", - "description": "Enable the experimental search and replace tool, allowing Roo to replace multiple instances of a search term in one request." + "description": "Enable the experimental search and replace tool, allowing TNE-Code to replace multiple instances of a search term in one request." }, "INSERT_BLOCK": { "name": "Use experimental insert content tool", - "description": "Enable the experimental insert content tool, allowing Roo to insert content at specific line numbers without needing to create a diff." + "description": "Enable the experimental insert content tool, allowing TNE-Code to insert content at specific line numbers without needing to create a diff." }, "POWER_STEERING": { "name": "Use experimental \"power steering\" mode", - "description": "When enabled, Roo will remind the model about the details of its current mode definition more frequently. This will lead to stronger adherence to role definitions and custom instructions, but will use more tokens per message." + "description": "When enabled, TNE-Code will remind the model about the details of its current mode definition more frequently. This will lead to stronger adherence to role definitions and custom instructions, but will use more tokens per message." }, "CONCURRENT_FILE_READS": { "name": "Enable concurrent file reads", - "description": "When enabled, Roo can read multiple files in a single request. When disabled, Roo must read files one at a time. Disabling this can help when working with less capable models or when you want more control over file access." + "description": "When enabled, TNE-Code can read multiple files in a single request (up to 15 files). When disabled, TNE-Code must read files one at a time. Disabling this can help when working with less capable models or when you want more control over file access." }, "MULTI_SEARCH_AND_REPLACE": { "name": "Use experimental multi block diff tool", - "description": "When enabled, Roo will use multi block diff tool. This will try to update multiple code blocks in the file in one request." + "description": "When enabled, TNE-Code will use multi block diff tool. This will try to update multiple code blocks in the file in one request." }, "DISABLE_COMPLETION_COMMAND": { "name": "Disable command execution in attempt_completion", @@ -500,7 +500,7 @@ }, "promptCaching": { "label": "Disable prompt caching", - "description": "When checked, Roo will not use prompt caching for this model." + "description": "When checked, TNE-Code will not use prompt caching for this model." }, "temperature": { "useCustom": "Use custom temperature", @@ -531,7 +531,7 @@ } }, "modelPicker": { - "automaticFetch": "The extension automatically fetches the latest list of models available on {{serviceName}}. If you're unsure which model to choose, Roo Code works best with {{defaultModelId}}. You can also try searching \"free\" for no-cost options currently available.", + "automaticFetch": "The extension automatically fetches the latest list of models available on {{serviceName}}. If you're unsure which model to choose, TNE-Code works best with {{defaultModelId}}. You can also try searching \"free\" for no-cost options currently available.", "label": "Model", "searchPlaceholder": "Search", "noMatchFound": "No match found", @@ -541,7 +541,7 @@ "feedback": "If you have any questions or feedback, feel free to open an issue at github.com/RooCodeInc/Roo-Code or join reddit.com/r/RooCode or discord.gg/roocode", "telemetry": { "label": "Allow anonymous error and usage reporting", - "description": "Help improve Roo Code by sending anonymous usage data and error reports. No code, prompts, or personal information is ever sent. See our privacy policy for more details." + "description": "Help improve TNE-Code by sending anonymous usage data and error reports. No code, prompts, or personal information is ever sent. See our privacy policy for more details." }, "settings": { "import": "Import", diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index f4b6e044bd..67241d6056 100644 --- a/webview-ui/src/i18n/locales/en/welcome.json +++ b/webview-ui/src/i18n/locales/en/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Hi, I'm Roo!", - "introduction": "Roo Code is the premiere autonomous coding agent. Get ready to architect, code, debug, and boost your productivity like you've never seen before. To continue, Roo Code requires an API key.", + "greeting": "Hi, I'm TNE-Code!", + "introduction": "TNE-Code is the premiere autonomous coding agent. Get ready to architect, code, debug, and boost your productivity like you've never seen before. To continue, TNE-Code requires an API key.", "notice": "To get started, this extension needs an API provider.", "start": "Let's go!", "chooseProvider": "Choose an API provider to get started:", @@ -16,7 +16,7 @@ "startRouter": "Express Setup Through a Router", "startCustom": "Bring Your Own API Key", "telemetry": { - "title": "Help Improve Roo Code", + "title": "Help Improve TNE-Code", "anonymousTelemetry": "Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, or personal information is ever sent.", "changeSettings": "You can always change this at the bottom of the settings", "settings": "settings",