From 8f35ca8f38bea8ecbab4ab50f196ac10991eacf4 Mon Sep 17 00:00:00 2001 From: Volodymyr Vreshch Date: Fri, 20 Mar 2026 01:39:54 +0100 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20Phase=201=20=E2=80=94=20rewrite=20@?= =?UTF-8?q?agentage/core=20+=20new=20@agentage/platform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full source rewrite of @agentage/core from new spec (Agent, AgentFactory, Run, RunEvent, createAgent) and new @agentage/platform package (Machine, Heartbeat, WS protocol types). - Drop @agentage/sdk and @agentage/model-openai - Modernize tooling: Vitest, ES2024, NodeNext, Node 22 - 45 tests, 100% coverage --- .github/copilot-instructions.md | 113 - .github/dependabot.yml | 4 - .github/workflows/ci.yml | 71 +- .github/workflows/pr-validation.yml | 91 +- .github/workflows/publish.yml | 107 +- .gitignore | 14 +- .npmrc | 2 +- .nvmrc | 1 + .prettierrc.json | 2 +- CHANGELOG.md | 104 - CONTRIBUTING.md | 440 - README.md | 516 +- docs/README.md | 176 - docs/advanced-usage.md | 799 -- docs/api-reference.md | 752 -- docs/getting-started.md | 524 -- docs/migration.md | 468 -- docs/tool-development.md | 879 -- eslint.config.js => eslint.config.mjs | 10 +- examples/agent-sdk-basic-example/.env.example | 3 - examples/agent-sdk-basic-example/.gitignore | 3 - examples/agent-sdk-basic-example/README.md | 59 - examples/agent-sdk-basic-example/index.ts | 25 - .../agent-sdk-basic-example/package-lock.json | 660 -- examples/agent-sdk-basic-example/package.json | 21 - .../agent-sdk-basic-example/tsconfig.json | 17 - .../agent-sdk-basic-tool-example/.env.example | 1 - .../agent-sdk-basic-tool-example/.gitignore | 4 - .../agent-sdk-basic-tool-example/README.md | 91 - .../agent-sdk-basic-tool-example/index.ts | 70 - .../package-lock.json | 668 -- .../agent-sdk-basic-tool-example/package.json | 22 - jest.config.js | 31 - package-lock.json | 7360 ++++------------- package.json | 41 +- packages/.gitkeep | 0 packages/README.md | 6 - packages/core/.npmignore | 20 - packages/core/LICENSE | 21 - packages/core/README.md | 109 - packages/core/eslint.config.js | 28 - packages/core/jest.config.js | 19 - packages/core/package.json | 47 +- packages/core/src/constants.test.ts | 36 + packages/core/src/constants.ts | 32 +- packages/core/src/create-agent.test.ts | 126 + packages/core/src/create-agent.ts | 36 + packages/core/src/index.test.ts | 32 - packages/core/src/index.ts | 25 +- packages/core/src/integration.test.ts | 54 + packages/core/src/state-machine.test.ts | 102 + packages/core/src/state-machine.ts | 9 + packages/core/src/types.ts | 150 + packages/core/src/types/agent.types.test.ts | 119 - packages/core/src/types/agent.types.ts | 45 - packages/core/src/types/config.types.test.ts | 109 - packages/core/src/types/config.types.ts | 46 - packages/core/src/types/message.types.test.ts | 112 - packages/core/src/types/message.types.ts | 58 - packages/core/src/types/model.types.ts | 17 - .../src/types/modelprovider.types.test.ts | 208 - .../core/src/types/modelprovider.types.ts | 101 - packages/core/src/types/result.types.test.ts | 95 - packages/core/src/types/result.types.ts | 20 - packages/core/src/types/tool.types.test.ts | 103 - packages/core/src/types/tool.types.ts | 77 - packages/core/tsconfig.json | 8 +- packages/model-openai/.gitignore | 8 - packages/model-openai/.npmignore | 20 - packages/model-openai/LICENSE | 21 - packages/model-openai/README.md | 46 - packages/model-openai/eslint.config.js | 46 - packages/model-openai/jest.config.js | 27 - packages/model-openai/package.json | 56 - packages/model-openai/src/index.test.ts | 7 - packages/model-openai/src/index.ts | 3 - packages/model-openai/tsconfig.json | 33 - packages/platform/package.json | 55 + packages/platform/src/constants.test.ts | 26 + packages/platform/src/constants.ts | 11 + packages/platform/src/index.ts | 27 + packages/platform/src/types.test.ts | 94 + packages/platform/src/types.ts | 139 + packages/platform/tsconfig.json | 13 + packages/sdk/.npmignore | 34 - packages/sdk/.prettierignore | 5 - packages/sdk/.prettierrc.json | 10 - packages/sdk/README.md | 247 - packages/sdk/eslint.config.js | 52 - packages/sdk/jest.config.js | 27 - packages/sdk/package.json | 57 - packages/sdk/src/agent.test.ts | 64 - packages/sdk/src/agent.ts | 275 - packages/sdk/src/errors.test.ts | 62 - packages/sdk/src/errors.ts | 51 - packages/sdk/src/index.test.ts | 7 - packages/sdk/src/index.ts | 6 - packages/sdk/src/sdk.test.ts | 143 - packages/sdk/src/tool.ts | 23 - packages/sdk/src/types/agent.types.test.ts | 105 - packages/sdk/src/types/agent.types.ts | 82 - packages/sdk/src/types/factory.types.ts | 23 - packages/sdk/src/types/sdk.types.ts | 16 - packages/sdk/tsconfig.json | 33 - tsconfig.json | 33 +- vitest.config.ts | 18 + 106 files changed, 2967 insertions(+), 15157 deletions(-) delete mode 100644 .github/copilot-instructions.md create mode 100644 .nvmrc delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 docs/README.md delete mode 100644 docs/advanced-usage.md delete mode 100644 docs/api-reference.md delete mode 100644 docs/getting-started.md delete mode 100644 docs/migration.md delete mode 100644 docs/tool-development.md rename eslint.config.js => eslint.config.mjs (85%) delete mode 100644 examples/agent-sdk-basic-example/.env.example delete mode 100644 examples/agent-sdk-basic-example/.gitignore delete mode 100644 examples/agent-sdk-basic-example/README.md delete mode 100644 examples/agent-sdk-basic-example/index.ts delete mode 100644 examples/agent-sdk-basic-example/package-lock.json delete mode 100644 examples/agent-sdk-basic-example/package.json delete mode 100644 examples/agent-sdk-basic-example/tsconfig.json delete mode 100644 examples/agent-sdk-basic-tool-example/.env.example delete mode 100644 examples/agent-sdk-basic-tool-example/.gitignore delete mode 100644 examples/agent-sdk-basic-tool-example/README.md delete mode 100644 examples/agent-sdk-basic-tool-example/index.ts delete mode 100644 examples/agent-sdk-basic-tool-example/package-lock.json delete mode 100644 examples/agent-sdk-basic-tool-example/package.json delete mode 100644 jest.config.js delete mode 100644 packages/.gitkeep delete mode 100644 packages/README.md delete mode 100644 packages/core/.npmignore delete mode 100644 packages/core/LICENSE delete mode 100644 packages/core/README.md delete mode 100644 packages/core/eslint.config.js delete mode 100644 packages/core/jest.config.js create mode 100644 packages/core/src/constants.test.ts create mode 100644 packages/core/src/create-agent.test.ts create mode 100644 packages/core/src/create-agent.ts delete mode 100644 packages/core/src/index.test.ts create mode 100644 packages/core/src/integration.test.ts create mode 100644 packages/core/src/state-machine.test.ts create mode 100644 packages/core/src/state-machine.ts create mode 100644 packages/core/src/types.ts delete mode 100644 packages/core/src/types/agent.types.test.ts delete mode 100644 packages/core/src/types/agent.types.ts delete mode 100644 packages/core/src/types/config.types.test.ts delete mode 100644 packages/core/src/types/config.types.ts delete mode 100644 packages/core/src/types/message.types.test.ts delete mode 100644 packages/core/src/types/message.types.ts delete mode 100644 packages/core/src/types/model.types.ts delete mode 100644 packages/core/src/types/modelprovider.types.test.ts delete mode 100644 packages/core/src/types/modelprovider.types.ts delete mode 100644 packages/core/src/types/result.types.test.ts delete mode 100644 packages/core/src/types/result.types.ts delete mode 100644 packages/core/src/types/tool.types.test.ts delete mode 100644 packages/core/src/types/tool.types.ts delete mode 100644 packages/model-openai/.gitignore delete mode 100644 packages/model-openai/.npmignore delete mode 100644 packages/model-openai/LICENSE delete mode 100644 packages/model-openai/README.md delete mode 100644 packages/model-openai/eslint.config.js delete mode 100644 packages/model-openai/jest.config.js delete mode 100644 packages/model-openai/package.json delete mode 100644 packages/model-openai/src/index.test.ts delete mode 100644 packages/model-openai/src/index.ts delete mode 100644 packages/model-openai/tsconfig.json create mode 100644 packages/platform/package.json create mode 100644 packages/platform/src/constants.test.ts create mode 100644 packages/platform/src/constants.ts create mode 100644 packages/platform/src/index.ts create mode 100644 packages/platform/src/types.test.ts create mode 100644 packages/platform/src/types.ts create mode 100644 packages/platform/tsconfig.json delete mode 100644 packages/sdk/.npmignore delete mode 100644 packages/sdk/.prettierignore delete mode 100644 packages/sdk/.prettierrc.json delete mode 100644 packages/sdk/README.md delete mode 100644 packages/sdk/eslint.config.js delete mode 100644 packages/sdk/jest.config.js delete mode 100644 packages/sdk/package.json delete mode 100644 packages/sdk/src/agent.test.ts delete mode 100644 packages/sdk/src/agent.ts delete mode 100644 packages/sdk/src/errors.test.ts delete mode 100644 packages/sdk/src/errors.ts delete mode 100644 packages/sdk/src/index.test.ts delete mode 100644 packages/sdk/src/index.ts delete mode 100644 packages/sdk/src/sdk.test.ts delete mode 100644 packages/sdk/src/tool.ts delete mode 100644 packages/sdk/src/types/agent.types.test.ts delete mode 100644 packages/sdk/src/types/agent.types.ts delete mode 100644 packages/sdk/src/types/factory.types.ts delete mode 100644 packages/sdk/src/types/sdk.types.ts delete mode 100644 packages/sdk/tsconfig.json create mode 100644 vitest.config.ts diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index bb1e98e..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,113 +0,0 @@ -# AgentKit - Development Instructions - -## **Project Overview** - -- AI agent framework and SDK - TypeScript monorepo -- Minimal interface definitions for building AI agents -- Core SDK package with builder and config patterns -- npm workspaces for package management - -## **Project Agreements** - -- Default branch: `master` -- Repository: `agentage/agentkit` -- Branch names: `feature/*`, `bugfix/*`, `hotfix/*`, `setup-*` -- Commits: `feat:`, `fix:`, `chore:` (max 72 chars) -- Verifications: `npm run verify` (type-check + lint + build + test) - -## **Publishing** - -- The packages are published to npm under the `@agentage` scope. -- Auto-publish on push to `master` when `package.json` version is bumped. - -## **Release Strategy** - -- ๐ŸŽฏ **MINIMAL FIRST**: Interface definitions only, no implementations -- ๐Ÿšซ **No Over-Engineering**: Keep SDK under 100 LOC -- โšก **Essential Only**: Core types and interfaces - -## **Rules** - -- ๐Ÿ“Š Use icons/tables for structured output -- ๐Ÿ“ NO extra docs unless explicitly asked -- ๐Ÿ™ GitHub: owner `agentage`, repo `agentkit` -- โšก Prefer function calls over terminal commands -- ๐Ÿ“ฆ Monorepo: All packages in `packages/*` - -## **Coding Standards** - -### TypeScript -- ๐Ÿšซ No `any` type - explicit types always -- ๐Ÿ“ค Named exports only (no default exports) -- ๐Ÿ“ SDK package <100 lines, files <200 lines -- ๐Ÿ”„ Functional: arrow functions, async/await, destructuring -- ๐Ÿ—๏ธ Interfaces over classes -- โœ… ESM modules (`type: "module"`) - -### Naming - -- **Interfaces**: `AgentConfig`, `AgentResponse`, `Tool` -- **Types**: `AgentFactory`, `CreateToolConfig` -- **Files**: `agent.types.ts`, `factory.types.ts`, `*.test.ts` - -## **Tech Stack** - -- **Language**: TypeScript 5.3+ (strict mode) -- **Module**: ESNext with ESM -- **Testing**: Jest 30+ with ts-jest -- **Linting**: ESLint 9+ (flat config) -- **Formatting**: Prettier -- **Package Manager**: npm (workspaces) - -## **Node Requirements** - -- Node.js >= 20.0.0 -- npm >= 10.0.0 - -## **API Patterns** - -Both patterns supported: - -**Builder Pattern**: -```typescript -agent('name') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are helpful') - .tools([tool]) - .send('message') -``` - -**Config Object**: -```typescript -agent({ name: 'name', model: 'gpt-4', ... }) - .send('message') -``` - -## **Workspace Structure** - -``` -packages/ - sdk/ # @agentkit/sdk - Core interfaces -``` - -## **Scripts** - -All packages support: - -- `npm run build` - Build TypeScript -- `npm run type-check` - TypeScript validation -- `npm run lint` - ESLint check -- `npm run lint:fix` - Auto-fix linting -- `npm run test` - Run Jest tests -- `npm run test:watch` - Watch mode -- `npm run test:coverage` - Coverage report -- `npm run verify` - All checks -- `npm run clean` - Clean build artifacts - -## **Quality Gates** - -- โœ… Type check must pass -- โœ… Linting must pass (no warnings) -- โœ… All tests must pass -- โœ… Coverage >= 70% (branches, functions, lines, statements) -- โœ… Build must succeed diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3548986..cf6ae80 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,10 +21,6 @@ updates: - 'prettier' - 'vitest*' - '@vitest/*' - - 'jest*' - - 'ts-jest' - - '@playwright/*' - - 'playwright*' - '@testing-library/*' - 'postcss' - 'autoprefixer' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0ff44b7..c43c727 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,83 +9,28 @@ permissions: contents: read env: - NODE_VERSION: '20' + NODE_VERSION: '22' jobs: test: - name: ๐Ÿงช Verify Packages + name: Verify Packages runs-on: ubuntu-latest steps: - - name: ๐Ÿ“ฅ Checkout code + - name: Checkout code uses: actions/checkout@v5 - - name: ๐Ÿ”ง Setup Node.js + - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - - name: ๐Ÿ“ฆ Install dependencies + - name: Install dependencies run: npm ci - - name: ๐Ÿ—๏ธ Build packages - run: npm run build - - - name: โœ… Verify all packages + - name: Verify all packages run: npm run verify - - name: โœ… All checks passed - run: echo "๐ŸŽ‰ All CI checks passed successfully!" - - verify-examples: - name: ๐Ÿ” Verify Examples - runs-on: ubuntu-latest - - steps: - - name: ๐Ÿ“ฅ Checkout code - uses: actions/checkout@v5 - - - name: ๐Ÿ”ง Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: 'npm' - - - name: ๐Ÿ“ฆ Install dependencies - run: npm ci - - - name: ๐Ÿ—๏ธ Build packages - run: npm run build - - - name: ๐Ÿ” Verify examples - run: | - echo "๐Ÿ” Verifying examples..." - - for example_dir in examples/*; do - if [ ! -d "$example_dir" ]; then - continue - fi - - example_name=$(basename "$example_dir") - echo "" - echo "๐Ÿ“ฆ Verifying example: $example_name" - - cd "$example_dir" - - # Install dependencies - npm install - - # Type check - if [ -f "tsconfig.json" ]; then - echo " ๐Ÿ” Type checking..." - npx tsc --noEmit - fi - - cd ../.. - - echo " โœ… $example_name verified" - done - - echo "" - echo "โœ… All examples verified successfully!" + - name: All checks passed + run: echo "All CI checks passed successfully!" diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index 59565f0..ad202bf 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -13,83 +13,54 @@ permissions: actions: read env: - NODE_VERSION: '20' + NODE_VERSION: '22' jobs: validate: - name: ๐Ÿ” Validate Pull Request + name: Validate Pull Request runs-on: ubuntu-latest outputs: validation-result: ${{ steps.validation-summary.outputs.result }} pr-comment-body: ${{ steps.validation-summary.outputs.comment-body }} steps: - - name: ๐Ÿ“ฅ Checkout code + - name: Checkout code uses: actions/checkout@v5 - - name: ๐Ÿ”ง Setup Node.js + - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - - name: ๐Ÿ“ฆ Install dependencies + - name: Install dependencies run: npm ci - - name: ๐Ÿ—๏ธ Build - id: build - run: npm run build - - - name: ๐Ÿ” Type check + - name: Type check id: type-check run: npm run type-check - - name: ๐ŸŽจ Lint + - name: Lint id: lint run: npm run lint - - name: ๐Ÿงช Test + - name: Format check + id: format-check + run: npm run format:check + + - name: Test id: test run: npm run test - - name: ๐Ÿ“Š Test Coverage + - name: Test Coverage id: coverage run: npm run test:coverage - - name: ๐Ÿ” Verify Examples - id: examples - run: | - echo "๐Ÿ” Verifying examples..." - - for example_dir in examples/*; do - if [ ! -d "$example_dir" ]; then - continue - fi - - example_name=$(basename "$example_dir") - echo "" - echo "๐Ÿ“ฆ Verifying example: $example_name" - - cd "$example_dir" - - # Install dependencies - npm install - - # Type check - if [ -f "tsconfig.json" ]; then - echo " ๐Ÿ” Type checking..." - npx tsc --noEmit - fi - - cd ../.. - - echo " โœ… $example_name verified" - done - - echo "" - echo "โœ… All examples verified successfully!" - - - name: ๐Ÿ“Š Validation Summary + - name: Build + id: build + run: npm run build + + - name: Validation Summary id: validation-summary if: always() run: | @@ -97,35 +68,35 @@ jobs: cat << 'EOF' >> $GITHUB_OUTPUT comment-body< comment.body.includes(workflowSignature) && comment.user.login === 'github-actions[bot]'); diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 444645b..2661bc6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,50 +12,50 @@ permissions: id-token: write env: - NODE_VERSION: "20" + NODE_VERSION: "22" jobs: detect-changes: - name: ๐Ÿ” Detect Version Changes + name: Detect Version Changes runs-on: ubuntu-latest outputs: packages: ${{ steps.detect.outputs.packages }} has-changes: ${{ steps.detect.outputs.has-changes }} steps: - - name: ๐Ÿ“ฅ Checkout code + - name: Checkout code uses: actions/checkout@v5 - - name: ๐Ÿ”ง Setup Node.js + - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - - name: ๐Ÿ“ฆ Install dependencies + - name: Install dependencies run: npm ci - - name: ๐Ÿ” Detect changed package versions + - name: Detect changed package versions id: detect run: | # Function to get package info get_package_info() { local pkg_dir=$1 local pkg_json="${pkg_dir}/package.json" - + if [ ! -f "$pkg_json" ]; then return fi - + local name=$(node -p "require('./${pkg_json}').name") local version=$(node -p "require('./${pkg_json}').version") local private=$(node -p "require('./${pkg_json}').private || false") - + # Skip private packages if [ "$private" = "true" ]; then return fi - + echo "${pkg_dir}|${name}|${version}" } @@ -63,7 +63,7 @@ jobs: version_exists_on_npm() { local name=$1 local version=$2 - + # Try to get the specific version from npm if npm view "${name}@${version}" version 2>/dev/null; then return 0 # Version exists @@ -74,26 +74,26 @@ jobs: changed_packages=() - # Check all packages - for pkg_dir in packages/*; do + # Check packages in dependency order (core first, then platform) + for pkg_dir in packages/core packages/platform; do if [ ! -d "$pkg_dir" ]; then continue fi - + pkg_info=$(get_package_info "$pkg_dir") if [ -z "$pkg_info" ]; then continue fi - + IFS='|' read -r dir name version <<< "$pkg_info" - - echo "๐Ÿ“ฆ Checking ${name}@${version}..." - + + echo "Checking ${name}@${version}..." + # Check if this version exists on npm if version_exists_on_npm "$name" "$version"; then - echo "โญ๏ธ Version ${version} already published for ${name}" + echo "Version ${version} already published for ${name}" else - echo "โœจ New version detected: ${name}@${version}" + echo "New version detected: ${name}@${version}" changed_packages+=("{\"name\":\"${name}\",\"version\":\"${version}\",\"dir\":\"${dir}\"}") fi done @@ -102,17 +102,17 @@ jobs: if [ ${#changed_packages[@]} -eq 0 ]; then echo "has-changes=false" >> $GITHUB_OUTPUT echo "packages=[]" >> $GITHUB_OUTPUT - echo "โ„น๏ธ No version changes detected" + echo "No version changes detected" else echo "has-changes=true" >> $GITHUB_OUTPUT packages_json=$(printf '%s\n' "${changed_packages[@]}" | jq -s -c '.') echo "packages=${packages_json}" >> $GITHUB_OUTPUT - echo "๐ŸŽฏ Packages to publish:" + echo "Packages to publish:" echo "${packages_json}" | jq '.' fi verify: - name: โœ… Verify ${{ matrix.package.name }}@${{ matrix.package.version }} + name: Verify ${{ matrix.package.name }}@${{ matrix.package.version }} needs: [detect-changes] if: needs.detect-changes.outputs.has-changes == 'true' runs-on: ubuntu-latest @@ -122,67 +122,68 @@ jobs: fail-fast: true steps: - - name: ๐Ÿ“ฅ Checkout code + - name: Checkout code uses: actions/checkout@v5 - - name: ๐Ÿ”ง Setup Node.js + - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - - name: ๐Ÿ“ฆ Install dependencies + - name: Install dependencies run: npm ci - - name: ๐Ÿ—๏ธ Build all workspace packages + - name: Build all workspace packages run: npm run build - - name: โœ… Run verification + - name: Run verification working-directory: ${{ matrix.package.dir }} run: | - echo "๐Ÿ” Verifying ${{ matrix.package.name }}@${{ matrix.package.version }}" + echo "Verifying ${{ matrix.package.name }}@${{ matrix.package.version }}" npm run verify - - name: โœ… Verification passed + - name: Verification passed run: | - echo "โœ… ${{ matrix.package.name }}@${{ matrix.package.version }} verified successfully" >> $GITHUB_STEP_SUMMARY + echo "${{ matrix.package.name }}@${{ matrix.package.version }} verified successfully" >> $GITHUB_STEP_SUMMARY publish: - name: ๐Ÿ“ค Publish ${{ matrix.package.name }}@${{ matrix.package.version }} + name: Publish ${{ matrix.package.name }}@${{ matrix.package.version }} needs: [detect-changes, verify] if: needs.detect-changes.outputs.has-changes == 'true' && needs.verify.result == 'success' runs-on: ubuntu-latest strategy: matrix: package: ${{ fromJson(needs.detect-changes.outputs.packages) }} - fail-fast: false + max-parallel: 1 + fail-fast: true steps: - - name: ๐Ÿ“ฅ Checkout code + - name: Checkout code uses: actions/checkout@v5 - - name: ๐Ÿ”ง Setup Node.js + - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" registry-url: "https://registry.npmjs.org" - - name: ๐Ÿ“ฆ Install dependencies + - name: Install dependencies run: npm ci - - name: ๐Ÿ—๏ธ Build all workspace packages + - name: Build all workspace packages run: npm run build - - name: ๐Ÿ“ค Publish to npm + - name: Publish to npm working-directory: ${{ matrix.package.dir }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - echo "๐Ÿ“ค Publishing ${{ matrix.package.name }}@${{ matrix.package.version }}" + echo "Publishing ${{ matrix.package.name }}@${{ matrix.package.version }}" npm publish --access public --provenance - - name: ๐Ÿท๏ธ Create git tag + - name: Create git tag run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" @@ -194,33 +195,33 @@ jobs: git tag -a "${TAG_NAME}" -m "Release ${{ matrix.package.name }}@${{ matrix.package.version }}" git push origin "${TAG_NAME}" - - name: โœ… Published successfully + - name: Published successfully run: | - echo "๐ŸŽ‰ Successfully published ${{ matrix.package.name }}@${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY - echo "๐Ÿ“ฆ Package URL: https://www.npmjs.com/package/${{ matrix.package.name }}/v/${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY + echo "Successfully published ${{ matrix.package.name }}@${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY + echo "Package URL: https://www.npmjs.com/package/${{ matrix.package.name }}/v/${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY summary: - name: ๐Ÿ“‹ Publish Summary + name: Publish Summary needs: [detect-changes, verify, publish] if: always() && needs.detect-changes.outputs.has-changes == 'true' runs-on: ubuntu-latest steps: - - name: ๐Ÿ“Š Create summary + - name: Create summary run: | - echo "## ๐Ÿ“ฆ Package Publishing Summary" >> $GITHUB_STEP_SUMMARY + echo "## Package Publishing Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ "${{ needs.verify.result }}" != "success" ]; then - echo "โŒ **Verification failed - packages not published**" >> $GITHUB_STEP_SUMMARY + echo "**Verification failed - packages not published**" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "Please fix verification errors and try again." >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.publish.result }}" == "success" ]; then - echo "โœ… **All packages published successfully!**" >> $GITHUB_STEP_SUMMARY + echo "**All packages published successfully!**" >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.publish.result }}" == "skipped" ]; then - echo "โญ๏ธ **Publishing skipped - verification failed**" >> $GITHUB_STEP_SUMMARY + echo "**Publishing skipped - verification failed**" >> $GITHUB_STEP_SUMMARY else - echo "โš ๏ธ **Some packages failed to publish**" >> $GITHUB_STEP_SUMMARY + echo "**Some packages failed to publish**" >> $GITHUB_STEP_SUMMARY fi echo "" >> $GITHUB_STEP_SUMMARY @@ -230,9 +231,9 @@ jobs: packages='${{ needs.detect-changes.outputs.packages }}' if [ "${{ needs.verify.result }}" == "success" ] && [ "${{ needs.publish.result }}" == "success" ]; then - echo "$packages" | jq -r '.[] | "- โœ… **\(.name)** version \(.version) - Published"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Published"' >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.verify.result }}" != "success" ]; then - echo "$packages" | jq -r '.[] | "- โŒ **\(.name)** version \(.version) - Verification failed"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Verification failed"' >> $GITHUB_STEP_SUMMARY else - echo "$packages" | jq -r '.[] | "- โญ๏ธ **\(.name)** version \(.version) - Skipped"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Skipped"' >> $GITHUB_STEP_SUMMARY fi diff --git a/.gitignore b/.gitignore index 358f9d6..1bcd784 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,16 @@ pnpm-lock.yaml dist/ build/ *.tsbuildinfo +packages/*/src/**/*.d.ts +packages/*/src/**/*.d.ts.map +packages/*/src/**/*.js +packages/*/src/**/*.js.map +vitest.config.d.ts +vitest.config.d.ts.map +vitest.config.js +vitest.config.js.map +eslint.config.d.ts +eslint.config.d.ts.map # Testing coverage/ @@ -40,7 +50,3 @@ yarn-error.log* tmp/ temp/ *.tmp - -# Examples (reference only) -example1/ -example2/ diff --git a/.npmrc b/.npmrc index c3608bf..1b78f1c 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ save-exact=true -legacy-peer-deps=false +legacy-peer-deps=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/.prettierrc.json b/.prettierrc.json index 3171de5..32a2397 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,7 +2,7 @@ "semi": true, "trailingComma": "es5", "singleQuote": true, - "printWidth": 80, + "printWidth": 100, "tabWidth": 2, "useTabs": false, "arrowParens": "always", diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index c693cc0..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,104 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -### Added -- Comprehensive documentation for SDK, CLI, and packages -- CONTRIBUTING.md with development guidelines -- Complete API reference documentation -- Getting started guide for new users -- Tool development guide -- Advanced usage patterns documentation - -### Changed -- Enhanced README with more examples and troubleshooting - -### Deprecated -- Nothing yet - -### Removed -- Nothing yet - -### Fixed -- Nothing yet - -### Security -- Nothing yet - -## [0.1.2] - 2024-11-08 - -### Added -- CLI: `agent init` command for creating new agent definitions -- CLI: `agent run` command for executing agents from YAML files -- CLI: `agent list` command for viewing available agents -- CLI: YAML parser for agent definitions with schema validation -- Examples: Basic SDK example demonstrating agent creation -- Examples: Tool example with calculator implementation -- SDK: Error classes for better error handling -- Core: Result types for agent execution outcomes - -### Changed -- Updated TypeScript to 5.9.3 -- Improved error messages in CLI commands -- Enhanced tool execution with better error context -- Standardized naming conventions across packages - -### Fixed -- Fixed agent.yml parsing with empty tools array -- Resolved model configuration merging issues -- Fixed tool schema validation edge cases - -## [0.1.1] - 2024-11-07 - -### Added -- SDK: Builder pattern API for agent creation -- SDK: Config object pattern as alternative to builder -- SDK: Tool execution with Zod schema validation -- SDK: Model configuration with temperature and token limits -- Core: Tool types and interfaces -- Core: Message types for agent communication -- Documentation: Basic README for each package - -### Changed -- Simplified agent creation API -- Improved type safety across all packages -- Enhanced tool definition interface - -### Fixed -- Tool input validation error handling -- Model provider configuration issues - -## [0.1.0] - 2024-11-06 - -### Added -- Initial release of AgentKit -- Core: Type definitions for agents, tools, models, and messages -- Core: Interface definitions for model providers -- Core: Configuration types -- SDK: Core agent factory function -- SDK: Tool creation utilities -- Model OpenAI: OpenAI model adapter implementation -- Model OpenAI: GPT-3.5 and GPT-4 support -- Model OpenAI: Function calling support for tools -- Monorepo structure with npm workspaces -- TypeScript 5.3+ support with strict mode -- ESLint configuration with flat config -- Jest configuration for testing -- Basic examples and documentation - -### Infrastructure -- npm workspaces for package management -- Shared TypeScript configuration -- Shared ESLint configuration -- Shared Jest configuration -- CI/CD setup (to be configured) - -[Unreleased]: https://github.com/agentage/agentkit/compare/v0.1.2...HEAD -[0.1.2]: https://github.com/agentage/agentkit/compare/v0.1.1...v0.1.2 -[0.1.1]: https://github.com/agentage/agentkit/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/agentage/agentkit/releases/tag/v0.1.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 9e89823..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,440 +0,0 @@ -# Contributing to AgentKit - -Thank you for your interest in contributing to AgentKit! This document provides guidelines and instructions for contributing to the project. - -## Code of Conduct - -- **Be respectful**: Treat all contributors with respect and professionalism -- **Be constructive**: Provide helpful feedback and suggestions -- **Be collaborative**: Work together to improve the project - -## Development Setup - -### Prerequisites - -- **Node.js**: 20.0.0 or higher -- **npm**: 10.0.0 or higher -- **Git**: Latest version - -### Clone and Install - -```bash -# Clone the repository -git clone https://github.com/agentage/agentkit.git -cd agentkit - -# Install dependencies -npm install - -# Build all packages -npm run build - -# Run tests -npm test -``` - -### Verify Your Setup - -```bash -# Run all quality checks (type-check + lint + build + test) -npm run verify -``` - -This command must pass before submitting a pull request. - -## Code Standards - -AgentKit follows strict coding standards for consistency and quality. - -### TypeScript Standards - -- โœ… **Strict mode**: Always use TypeScript strict mode -- โœ… **Named exports**: Use named exports only (no default exports) -- โŒ **No `any` type**: Use explicit types always -- โœ… **Functions over classes**: Prefer functions for logic -- โœ… **Async/await**: Use async/await over promises -- โœ… **Destructuring**: Use object/array destructuring -- โœ… **Interfaces over classes**: Define contracts with interfaces -- โœ… **ESM modules**: Use `type: "module"` in package.json - -### File Size Limits - -- **SDK package**: Max 100 lines total -- **Regular files**: Max 200 lines per file -- **Functions**: Max 20 lines per function -- **Split large files**: Break into smaller, focused modules - -### Naming Conventions - -#### Interfaces -```typescript -// โœ… Correct -export interface AgentConfig { } -export interface AgentResponse { } -export interface Tool { } -``` - -#### Types -```typescript -// โœ… Correct -export type AgentFactory = () => Agent; -export type CreateToolConfig = { }; -``` - -#### Files -```typescript -// โœ… Correct -agent.types.ts -factory.types.ts -agent.test.ts -index.ts -``` - -### Code Examples - -#### โœ… Good Example -```typescript -import { z } from 'zod'; - -export interface ToolConfig { - readonly name: string; - readonly description: string; - readonly inputSchema: z.ZodObject; -} - -export const createTool = async ( - config: ToolConfig -): Promise => { - const { name, description, inputSchema } = config; - - return { - name, - description, - execute: async (input: unknown) => { - const validated = inputSchema.parse(input); - return validated; - } - }; -}; -``` - -#### โŒ Bad Example -```typescript -// Default export - not allowed -export default class ToolFactory { - // Classes for logic - prefer functions - - constructor(private config: any) { // 'any' type - not allowed - // Constructor logic - } - - public createTool() { // Missing return type - return new Promise((resolve, reject) => { // Use async/await - // Promise logic - }); - } -} -``` - -## Project Structure - -``` -agentkit/ # Monorepo root -โ”œโ”€โ”€ packages/ # All packages -โ”‚ โ”œโ”€โ”€ sdk/ # @agentage/sdk - Core SDK -โ”‚ โ”œโ”€โ”€ core/ # @agentage/core - Core types -โ”‚ โ””โ”€โ”€ model-openai/ # @agentage/model-openai - OpenAI adapter -โ”œโ”€โ”€ examples/ # Example projects -โ”œโ”€โ”€ docs/ # Documentation -โ”œโ”€โ”€ package.json # Root package.json (workspaces) -โ”œโ”€โ”€ tsconfig.json # Root TypeScript config -โ”œโ”€โ”€ eslint.config.js # Root ESLint config -โ””โ”€โ”€ jest.config.js # Root Jest config -``` - -### Package Dependencies - -- **sdk** โ†’ depends on **core** -- **model-openai** โ†’ depends on **core** - -## Making Changes - -### 1. Create a Feature Branch - -Branch naming conventions: -- `feature/*` - New features -- `bugfix/*` - Bug fixes -- `hotfix/*` - Critical fixes -- `setup-*` - Setup/configuration changes - -```bash -# Create and checkout branch -git checkout -b feature/add-tool-validation -``` - -### 2. Write Code - -Follow the code standards above and ensure: -- Code is well-commented -- Logic is clear and simple -- Files are properly structured -- Types are explicit - -### 3. Add Tests - -All new code requires tests: - -```typescript -// Example test file: agent.test.ts -import { describe, it, expect } from '@jest/globals'; -import { agent } from './agent'; - -describe('agent', () => { - it('should create agent with name', () => { - const myAgent = agent('test-agent'); - expect(myAgent).toBeDefined(); - }); - - it('should set model correctly', () => { - const myAgent = agent('test').model('gpt-4'); - expect(myAgent).toBeDefined(); - }); -}); -``` - -### 4. Update Documentation - -- Update README if user-facing changes -- Update API docs if signature changes -- Add examples for new features -- Update CHANGELOG.md - -### 5. Run Verification - -```bash -# Run all checks -npm run verify -``` - -This runs: -- Type checking (`npm run type-check`) -- Linting (`npm run lint`) -- Build (`npm run build`) -- Tests (`npm test`) - -All must pass before submitting PR. - -## Pull Request Process - -### 1. Prepare Your PR - -```bash -# Ensure your branch is up to date -git checkout master -git pull origin master -git checkout feature/your-feature -git rebase master - -# Run verification one final time -npm run verify -``` - -### 2. Create Pull Request - -**PR Title Format**: -``` -type: brief description - -Examples: -feat: add tool validation -fix: resolve agent execution error -docs: update API reference -``` - -**PR Description Template**: -```markdown -## Description -Brief description of changes - -## Type of Change -- [ ] Bug fix -- [ ] New feature -- [ ] Breaking change -- [ ] Documentation update - -## Changes Made -- Change 1 -- Change 2 -- Change 3 - -## Testing -- [ ] Unit tests added/updated -- [ ] Integration tests added/updated -- [ ] All tests passing -- [ ] Manual testing completed - -## Checklist -- [ ] Code follows project standards -- [ ] Tests added/updated -- [ ] Documentation updated -- [ ] `npm run verify` passes -- [ ] No breaking changes (or documented) -``` - -### 3. Review Process - -- Maintainers will review your PR -- Address feedback promptly -- Keep discussions constructive -- Update PR as requested - -### 4. Merge - -Once approved: -- PR will be merged by maintainers -- Branch will be deleted -- Changes will appear in next release - -## Testing Requirements - -### Coverage Requirements - -- **New features**: >80% coverage -- **Bug fixes**: Add tests reproducing the bug -- **Overall project**: Maintain >70% coverage - -### Test Types - -#### Unit Tests -Test individual functions/modules: -```typescript -describe('createTool', () => { - it('should create tool with valid config', () => { - const tool = createTool({ - name: 'test', - description: 'Test tool', - inputSchema: z.object({}) - }); - expect(tool).toBeDefined(); - }); -}); -``` - -#### Integration Tests -Test component interactions: -```typescript -describe('agent with tools', () => { - it('should execute tool when requested', async () => { - const tool = createTool({ /* config */ }); - const myAgent = agent('test').tools([tool]); - const result = await myAgent.send('use the tool'); - expect(result).toBeDefined(); - }); -}); -``` - -## Commit Messages - -Follow conventional commit format: - -### Format -``` -type: description - -Examples: -feat: add streaming support -fix: resolve memory leak in agent -docs: update getting started guide -refactor: simplify tool creation -test: add integration tests for CLI -chore: update dependencies -``` - -### Types -- `feat`: New feature -- `fix`: Bug fix -- `docs`: Documentation only -- `refactor`: Code refactoring -- `test`: Adding/updating tests -- `chore`: Maintenance tasks -- `perf`: Performance improvements -- `ci`: CI/CD changes - -### Guidelines -- **Max 72 characters** for first line -- Use **imperative mood**: "add" not "added" -- Be **specific and clear** -- Reference issues: `fix: resolve #123` - -### Examples - -```bash -# Good commits -git commit -m "feat: add tool validation with zod schemas" -git commit -m "fix: resolve agent execution timeout issue" -git commit -m "docs: add migration guide for v0.2.0" - -# Bad commits -git commit -m "fixed stuff" # Too vague -git commit -m "Added new feature" # Not imperative -git commit -m "WIP" # Not descriptive -``` - -## Documentation - -### When to Update Documentation - -- **API changes**: Update API reference -- **New features**: Add to getting started or examples -- **Breaking changes**: Update migration guide -- **Bug fixes**: May need troubleshooting updates - -### Documentation Files - -- `README.md` - Project overview and quick start -- `CONTRIBUTING.md` - This file -- `CHANGELOG.md` - Version history -- `docs/` - Detailed documentation -- Package READMEs - Package-specific docs - -## Release Process - -Releases are managed by maintainers following this process: - -### Versioning - -We use [Semantic Versioning](https://semver.org/): -- `MAJOR.MINOR.PATCH` (e.g., `1.2.3`) -- **MAJOR**: Breaking changes -- **MINOR**: New features (backward compatible) -- **PATCH**: Bug fixes (backward compatible) - -### Release Steps - -1. **Update version** in package.json files -2. **Update CHANGELOG.md** with changes -3. **Create git tag**: `git tag -a v1.2.3 -m "Release v1.2.3"` -4. **Push tag**: `git push origin v1.2.3` -5. **Create GitHub release** with notes -6. **Publish to npm**: `npm publish` - -## Getting Help - -### Resources - -- **Documentation**: [docs/](./docs/) -- **Examples**: [examples/](./examples/) -- **API Reference**: [docs/api-reference.md](./docs/api-reference.md) - -### Community - -- **GitHub Issues**: [Report bugs or request features](https://github.com/agentage/agentkit/issues) -- **GitHub Discussions**: [Ask questions or discuss ideas](https://github.com/agentage/agentkit/discussions) - -### Contact - -For security issues, please email: security@agentage.dev - ---- - -Thank you for contributing to AgentKit! ๐Ÿš€ diff --git a/README.md b/README.md index d97aefc..f564d95 100644 --- a/README.md +++ b/README.md @@ -1,505 +1,65 @@ # AgentKit -[![npm version](https://img.shields.io/npm/v/@agentage/sdk.svg)](https://www.npmjs.com/package/@agentage/sdk) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![CI](https://github.com/agentage/agentkit/actions/workflows/ci.yml/badge.svg)](https://github.com/agentage/agentkit/actions/workflows/ci.yml) -[![Coverage](https://codecov.io/gh/agentage/agentkit/branch/master/graph/badge.svg)](https://codecov.io/gh/agentage/agentkit) +TypeScript SDK for building agents on the [Agentage](https://agentage.io) platform. +## Packages -## Table of contents -- [AgentKit](#agentkit) - - [Table of contents](#table-of-contents) - - [Installation](#installation) - - [Features](#features) - - [Quick Start](#quick-start) - - [More Examples](#more-examples) - - [Philosophy](#philosophy) - - [API Reference](#api-reference) - - [Core API Patterns](#core-api-patterns) - - [Pattern 1: Builder (Express-like)](#pattern-1-builder-express-like) - - [Pattern 2: Config Object](#pattern-2-config-object) - - [Defining Tools](#defining-tools) - - [Troubleshooting](#troubleshooting) - - [FAQ](#faq) - - [Contributing](#contributing) - - [Running Tests](#running-tests) - - [License](#license) - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the [npm registry](https://www.npmjs.com/). - -Before installing, [download and install Node.js](https://nodejs.org/en/download/). Node.js 20 or higher is required. - -Installation is done using the [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```bash -npm install @agentage/sdk -``` - -## Features - -- **Functional API** - Fast and reliable - with no state management -- **Builder pattern** - Builder chainable API -- **Type-safe tools** - Zod-based schema validation -- **Multiple models** - Support for OpenAI, Anthropic, and custom adapters -- **Zero configuration** - Start building agents immediately +| Package | Description | +|---------|-------------| +| [`@agentage/core`](packages/core) | Agent interface, run model, state machine, event types | +| [`@agentage/platform`](packages/platform) | Daemon/hub protocol types โ€” machine, heartbeat, WebSocket messages | ## Quick Start -```typescript -import { agent } from '@agentage/sdk'; - -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are a helpful assistant') - .tools([searchTool, calculatorTool]); - -const result = await assistant.send('Help me with this task'); -console.log(result.content); -``` - -## More Examples - -### 1. Simple Q&A Agent - -```typescript -import { agent } from '@agentage/sdk'; - -const qa = agent('qa-bot') - .model('gpt-4') - .instructions('Answer questions concisely and accurately'); - -const answer = await qa.send('What is TypeScript?'); -console.log(answer.content); -``` - -### 2. Code Reviewer - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; -import { readFile } from 'fs/promises'; - -const readFileTool = tool( - { - name: 'read_file', - description: 'Read a file from disk', - inputSchema: { - path: z.string().describe('File path to read') - } - }, - async ({ path }) => { - return await readFile(path, 'utf-8'); - } -); - -const reviewer = agent('code-reviewer') - .model('gpt-4') - .instructions('Review code for bugs, security issues, and best practices') - .tools([readFileTool]); - -const review = await reviewer.send('Review src/index.ts'); -console.log(review.content); -``` - -### 3. Data Analyzer - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const fetchDataTool = tool( - { - name: 'fetch_data', - description: 'Fetch data from API', - inputSchema: { - endpoint: z.string(), - params: z.record(z.string()).optional() - } - }, - async ({ endpoint, params }) => { - const url = new URL(endpoint); - if (params) { - Object.entries(params).forEach(([key, value]) => { - url.searchParams.append(key, value); - }); - } - const response = await fetch(url.toString()); - return response.json(); - } -); - -const calculateStatsTool = tool( - { - name: 'calculate_stats', - description: 'Calculate statistics on numeric data', - inputSchema: { - data: z.array(z.number()), - metrics: z.array(z.enum(['mean', 'median', 'sum', 'min', 'max'])) - } - }, - async ({ data, metrics }) => { - const stats: Record = {}; - if (metrics.includes('mean')) { - stats.mean = data.reduce((a, b) => a + b, 0) / data.length; - } - if (metrics.includes('sum')) { - stats.sum = data.reduce((a, b) => a + b, 0); - } - if (metrics.includes('min')) { - stats.min = Math.min(...data); - } - if (metrics.includes('max')) { - stats.max = Math.max(...data); - } - return stats; - } -); - -const analyzer = agent('data-analyzer') - .model('gpt-4') - .instructions('Analyze data and provide insights') - .tools([fetchDataTool, calculateStatsTool]); - -const result = await analyzer.send('Analyze sales data for Q4 2024'); -console.log(result.content); -``` - -### 4. Multi-step Workflow - -```typescript -const workflow = agent('workflow') - .model('gpt-4') - .instructions('Execute multi-step tasks systematically') - .tools([searchWebTool, readFileTool, writeFileTool, sendEmailTool]); - -await workflow.send('Research AI trends, create summary, and email to team'); -``` - -### 5. Custom Model Configuration - -```typescript -// More creative (higher temperature) -const creative = agent('writer') - .model('gpt-4', { - temperature: 0.9, - max_tokens: 2000, - top_p: 1.0 - }) - .instructions('Write creative and engaging content'); - -// More deterministic (lower temperature) -const analyst = agent('analyst') - .model('gpt-4', { - temperature: 0.1, - max_tokens: 1000 - }) - .instructions('Provide precise, factual analysis'); -``` - -## Philosophy - -The AgentKit philosophy is to provide small, functional tooling for building AI agents, making it a great solution for chatbots, automation, data processing, or AI-powered applications. - -AgentKit does not force you to use any specific model or tool. With support for multiple model providers and custom adapters, you can quickly craft your perfect AI workflow. - -## API Reference - -### Core API Patterns - -#### Pattern 1: Builder (Express-like) - -```typescript -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are a helpful assistant') - .tools([searchTool, calculatorTool]); - -await assistant.send('Help me with this'); -``` - -#### Pattern 2: Config Object - -```typescript -const assistant = agent({ - name: 'assistant', - model: { - name: 'gpt-4', - config: { - temperature: 0.7 - } - }, - instructions: 'You are a helpful assistant', - tools: [searchTool, calculatorTool] -}); - -await assistant.send('Help me with this'); -``` - -Both patterns produce the same result - choose based on preference. - -### Defining Tools - -```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const githubTool = tool( - { - name: 'github', - title: 'GitHub Tool', - description: 'Access GitHub repositories', - inputSchema: { - repo: z.string(), - action: z.enum(['get', 'list', 'search']) - } - }, - async ({ repo, action }) => { - const response = await fetch(`https://api.github.com/repos/${repo}`); - return response.json(); - } -); - -const databaseTool = tool( - { - name: 'database', - title: 'Database Tool', - description: 'Query database', - inputSchema: { - query: z.string(), - limit: z.number().optional() - } - }, - async ({ query, limit = 10 }) => { - return await db.execute(query, { limit }); - } -); -``` - -## Troubleshooting - -### Common Issues - -#### Error: "OpenAI API key not found" - -**Solution**: Set your API key in environment variables - ```bash -export OPENAI_API_KEY='sk-...' +npm install @agentage/core ``` -Or use a `.env` file: - -```env -OPENAI_API_KEY=sk-your-key-here -``` - -```typescript -import 'dotenv/config'; -import { agent } from '@agentage/sdk'; -``` - -#### Error: "Tool execution failed" - -**Causes**: -- Invalid tool schema -- Missing required parameters -- Tool handler threw exception - -**Solution**: Check tool definition and handler implementation - -```typescript -// โœ… Correct -const myTool = tool( - { - name: 'my_tool', - description: 'Clear description of what the tool does', - inputSchema: { - param: z.string() // Explicit schema - } - }, - async (input) => { - // Handle errors gracefully - try { - return await doSomething(input.param); - } catch (error) { - throw new Error(`Tool failed: ${error.message}`); - } - } -); -``` - -#### Error: "Agent not responding" - -**Causes**: -- Model name incorrect -- API quota exceeded -- Network issues -- Invalid API key - -**Solution**: Check model name and API status - -```typescript -// โœ… Correct model names -.model('gpt-4') -.model('gpt-3.5-turbo') - -// โŒ Incorrect -.model('gpt4') // Missing hyphen -.model('GPT-4') // Wrong case -``` - -#### Build Errors - -```bash -# Clean and rebuild -npm run clean -npm install -npm run build -``` - -#### Type Errors - -Make sure you have the correct TypeScript version: - -```bash -npm install -D typescript@^5.3.0 -``` - -### Getting Help - -- **Documentation**: [docs/](./docs/) -- **GitHub Issues**: [Report bugs](https://github.com/agentage/agentkit/issues) -- **GitHub Discussions**: [Ask questions](https://github.com/agentage/agentkit/discussions) -- **API Reference**: [docs/api-reference.md](./docs/api-reference.md) - -## FAQ - -### Can I use models other than OpenAI? - -Yes! AgentKit supports multiple model providers: -- **OpenAI** (built-in via `@agentage/model-openai`) -- **Anthropic** (coming soon) -- **Custom adapters** (implement `ModelProvider` interface from `@agentage/core`) - -### How do I create custom tools? - -Use the `tool()` function with Zod schemas: - ```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const myTool = tool( - { - name: 'my_tool', - description: 'What the tool does', - inputSchema: { - param1: z.string().describe('Description of param1'), - param2: z.number().optional().describe('Optional parameter') - } +import { createAgent } from '@agentage/core'; + +const agent = createAgent({ + name: 'hello-agent', + description: 'A simple hello agent', + path: './hello-agent', + async *run(input) { + yield { + type: 'output', + data: { type: 'output', content: `Hello: ${input.task}`, format: 'text' }, + timestamp: Date.now(), + }; + yield { + type: 'result', + data: { type: 'result', success: true, output: 'done' }, + timestamp: Date.now(), + }; }, - async (input) => { - // Your logic here - return result; - } -); -``` - -See [docs/tool-development.md](./docs/tool-development.md) for more details. - -### Can I use this in production? - -Yes, but be aware of: -- **API costs**: AI model calls can add up quickly -- **Rate limiting**: Monitor your API usage -- **Error handling**: Implement robust error handling -- **Monitoring**: Track usage and costs -- **Security**: Never expose API keys in client-side code - -### How do I contribute? - -See [CONTRIBUTING.md](./CONTRIBUTING.md) for complete guidelines. - -### What's the difference between builder and config patterns? - -Both patterns work identically - choose based on your preference: - -```typescript -// Builder pattern (chainable) -const a1 = agent('name') - .model('gpt-4') - .instructions('...'); - -// Config pattern (object) -const a2 = agent({ - name: 'name', - model: { name: 'gpt-4' }, - instructions: '...' }); -``` - -### How do I handle streaming responses? - -Streaming is not currently supported in v0.1.x. This feature is planned for a future release. -### Can I save agent state? - -Agent execution is stateless by design. For persistence: -- Save agent definitions in YAML files (use CLI) -- Store conversation history separately -- Implement custom state management as needed - -### What Node.js version do I need? - -Node.js 20.0.0 or higher is required. - -### How do I test my agents? - -Write unit tests using Jest or your preferred testing framework: - -```typescript -import { describe, it, expect } from '@jest/globals'; -import { agent } from '@agentage/sdk'; - -describe('my agent', () => { - it('should respond correctly', async () => { - const myAgent = agent('test') - .model('gpt-4') - .instructions('Be helpful'); - - const result = await myAgent.send('Hello'); - expect(result.content).toBeDefined(); - }); -}); +const process = await agent.run({ task: 'world' }); +for await (const event of process.events) { + console.log(event.type, event.data); +} ``` -## Contributing - -The AgentKit project welcomes all constructive contributions. - -### Running Tests - -To run the test suite, first install the dependencies: +## Development ```bash -npm install -``` +# Install +npm ci -Then run `npm test`: +# Full verify (type-check + lint + format + test + build) +npm run verify -```bash -npm test +# Test with coverage +npm run test:coverage ``` -## License - -[MIT](https://github.com/agentage/agentkit/blob/master/LICENSE) +Requires Node.js >= 22.0.0. ---- - -**Simple. Functional. Powerful.** +## License -Built with โค๏ธ by the Agentage team +MIT diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 6f91592..0000000 --- a/docs/README.md +++ /dev/null @@ -1,176 +0,0 @@ -# AgentKit Documentation - -Welcome to the AgentKit documentation! This guide will help you build powerful AI agents with minimal code. - -## ๐Ÿ“š Documentation - -### Getting Started -- **[Getting Started Guide](./getting-started.md)** - Build your first agent in 5 minutes -- **[Installation & Setup](./getting-started.md#installation)** - Prerequisites and installation - -### Core Documentation -- **[API Reference](./api-reference.md)** - Complete API documentation -- **[Tool Development](./tool-development.md)** - Creating custom tools -- **[Advanced Usage](./advanced-usage.md)** - Advanced patterns and techniques - -### Migration & Updates -- **[Migration Guide](./migration.md)** - Upgrading between versions -- **[Changelog](../CHANGELOG.md)** - Version history and changes - -## ๐Ÿš€ Quick Links - -### Installation - -```bash -# SDK -npm install @agentage/sdk -``` - -### Quick Start - -```typescript -import { agent } from '@agentage/sdk'; - -const assistant = agent('assistant') - .model('gpt-4') - .instructions('You are a helpful assistant'); - -const result = await assistant.send('Hello!'); -console.log(result.content); -``` - -## ๐Ÿ’ก Core Concepts - -### Agents - -Agents are AI-powered assistants configured with: -- **Model**: The LLM to use (e.g., `gpt-4`, `gpt-3.5-turbo`) -- **Instructions**: System prompt defining behavior -- **Tools**: Functions the agent can call -- **Configuration**: Model parameters (temperature, max_tokens, etc.) - -### Tools - -Tools extend agent capabilities by providing callable functions: -- Defined with Zod schemas for type safety -- Input validation built-in -- Async execution support -- Error handling - -Example: -```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const searchTool = tool( - { - name: 'search', - description: 'Search the web', - inputSchema: { - query: z.string() - } - }, - async ({ query }) => { - // Your search logic - return results; - } -); -``` - -### Models - -Model providers connect to AI services: -- **OpenAI** (built-in via `@agentage/model-openai`) -- **Anthropic** (coming soon) -- **Custom adapters** (implement `ModelProvider` interface) - -### Messages - -Messages represent communication with agents: -- User messages (from you) -- Assistant messages (from the agent) -- Tool messages (tool execution results) -- System messages (instructions) - -## ๐Ÿ“– Guides by Topic - -### For Beginners -1. [Getting Started](./getting-started.md) - Your first agent -2. [Basic Examples](./getting-started.md#examples) - Simple use cases -3. [Tool Development](./tool-development.md) - Creating tools - -### For Advanced Users -1. [Advanced Usage](./advanced-usage.md) - Complex patterns -2. [Error Handling](./advanced-usage.md#error-handling) - Robust error handling -3. [Performance](./advanced-usage.md#performance) - Optimization tips -4. [API Reference](./api-reference.md) - Complete API details - -## ๐Ÿ”ง Resources - -### Code Examples -- [Examples Directory](../examples/) - Working code examples -- [Basic SDK Example](../examples/agent-sdk-basic-example/) - Simple agent -- [Tool Example](../examples/agent-sdk-basic-tool-example/) - Agent with tools - -### External Resources -- [GitHub Repository](https://github.com/agentage/agentkit) -- [npm Packages](https://www.npmjs.com/package/@agentage/sdk) -- [Issue Tracker](https://github.com/agentage/agentkit/issues) -- [Discussions](https://github.com/agentage/agentkit/discussions) - -### Contributing -- [Contributing Guide](../CONTRIBUTING.md) - How to contribute -- [Code Standards](../CONTRIBUTING.md#code-standards) - Coding guidelines -- [Development Setup](../CONTRIBUTING.md#development-setup) - Local setup - -## ๐Ÿ†˜ Getting Help - -### Common Issues -See the [Troubleshooting Guide](../README.md#troubleshooting) for solutions to common problems. - -### Support Channels -- **Bug Reports**: [GitHub Issues](https://github.com/agentage/agentkit/issues) -- **Questions**: [GitHub Discussions](https://github.com/agentage/agentkit/discussions) -- **Security**: security@agentage.dev - -## ๐Ÿ“ฆ Packages - -AgentKit is organized as a monorepo with multiple packages: - -| Package | Description | npm | -|---------|-------------|-----| -| `@agentage/sdk` | Main SDK for building agents | [![npm](https://img.shields.io/npm/v/@agentage/sdk.svg)](https://www.npmjs.com/package/@agentage/sdk) | -| `@agentage/core` | Core types and interfaces | [![npm](https://img.shields.io/npm/v/@agentage/core.svg)](https://www.npmjs.com/package/@agentage/core) | -| `@agentage/model-openai` | OpenAI model adapter | [![npm](https://img.shields.io/npm/v/@agentage/model-openai.svg)](https://www.npmjs.com/package/@agentage/model-openai) | - -## ๐Ÿ—บ๏ธ Documentation Structure - -``` -docs/ -โ”œโ”€โ”€ README.md # This file -โ”œโ”€โ”€ getting-started.md # Beginner's guide -โ”œโ”€โ”€ api-reference.md # Complete API docs -โ”œโ”€โ”€ tool-development.md # Tool creation guide -โ”œโ”€โ”€ advanced-usage.md # Advanced patterns -โ””โ”€โ”€ migration.md # Version migration -``` - -## ๐Ÿ“ Documentation Standards - -Our documentation follows these principles: -- **Clear**: Easy to understand for all skill levels -- **Complete**: Covers all features and APIs -- **Current**: Kept up to date with releases -- **Practical**: Includes working code examples -- **Searchable**: Well-organized and linked - -## ๐Ÿ”„ Keep Learning - -1. **Start Here**: [Getting Started Guide](./getting-started.md) -2. **Build Tools**: [Tool Development Guide](./tool-development.md) -3. **Go Deeper**: [Advanced Usage](./advanced-usage.md) -4. **Reference**: [API Documentation](./api-reference.md) - ---- - -**Questions?** Open a [discussion](https://github.com/agentage/agentkit/discussions) or check the [FAQ](../README.md#faq). diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md deleted file mode 100644 index 56d3945..0000000 --- a/docs/advanced-usage.md +++ /dev/null @@ -1,799 +0,0 @@ -# Advanced Usage - -Advanced patterns, techniques, and optimizations for AgentKit. - -## Table of Contents - -- [Multi-Agent Systems](#multi-agent-systems) -- [Error Handling](#error-handling) -- [Performance Optimization](#performance-optimization) -- [Conversation Management](#conversation-management) -- [Tool Composition](#tool-composition) -- [Custom Model Adapters](#custom-model-adapters) -- [Configuration Management](#configuration-management) -- [Production Deployment](#production-deployment) -- [Monitoring & Logging](#monitoring--logging) -- [Security Best Practices](#security-best-practices) - -## Multi-Agent Systems - -### Agent Coordination - -Use multiple specialized agents working together: - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; - -// Specialized agents -const researcher = agent('researcher') - .model('gpt-4', { temperature: 0.3 }) - .instructions('Research topics thoroughly and provide factual information'); - -const writer = agent('writer') - .model('gpt-4', { temperature: 0.8 }) - .instructions('Write engaging, creative content based on research'); - -const editor = agent('editor') - .model('gpt-4', { temperature: 0.2 }) - .instructions('Edit content for clarity, grammar, and consistency'); - -// Workflow -const topic = 'AI in healthcare'; - -const research = await researcher.send(`Research: ${topic}`); -const draft = await writer.send(`Write article based on: ${research.content}`); -const final = await editor.send(`Edit this article: ${draft.content}`); - -console.log(final.content); -``` - -### Agent Pipeline - -```typescript -interface PipelineStep { - agent: Agent; - transform?: (input: string, response: AgentResponse) => string; -} - -const runPipeline = async ( - input: string, - steps: PipelineStep[] -): Promise => { - let currentInput = input; - let lastResponse: AgentResponse = { content: '' }; - - for (const step of steps) { - lastResponse = await step.agent.send(currentInput); - - if (step.transform) { - currentInput = step.transform(currentInput, lastResponse); - } else { - currentInput = lastResponse.content; - } - } - - return lastResponse; -}; - -// Usage -const result = await runPipeline('Create a blog post about TypeScript', [ - { agent: researcher }, - { agent: writer }, - { - agent: editor, - transform: (_, response) => `Final edit: ${response.content}` - } -]); -``` - -### Parallel Agent Execution - -```typescript -const analyzeFromMultiplePerspectives = async (topic: string) => { - const technical = agent('technical') - .model('gpt-4') - .instructions('Analyze from technical perspective'); - - const business = agent('business') - .model('gpt-4') - .instructions('Analyze from business perspective'); - - const user = agent('user-experience') - .model('gpt-4') - .instructions('Analyze from user experience perspective'); - - // Run in parallel - const [techResult, bizResult, uxResult] = await Promise.all([ - technical.send(topic), - business.send(topic), - user.send(topic) - ]); - - // Synthesize results - const synthesizer = agent('synthesizer') - .model('gpt-4') - .instructions('Synthesize multiple perspectives into coherent analysis'); - - return synthesizer.send(` - Technical: ${techResult.content} - Business: ${bizResult.content} - UX: ${uxResult.content} - `); -}; -``` - -## Error Handling - -### Comprehensive Error Handling - -```typescript -import { - MissingApiKeyError, - UnsupportedModelError, - ToolNotFoundError, - NotImplementedError -} from '@agentage/sdk'; - -const safeAgentExecution = async ( - agentInstance: Agent, - message: string -): Promise => { - try { - return await agentInstance.send(message); - } catch (error) { - if (error instanceof MissingApiKeyError) { - console.error('API key not configured. Set OPENAI_API_KEY.'); - return null; - } - - if (error instanceof UnsupportedModelError) { - console.error('Unsupported model:', error.message); - return null; - } - - if (error instanceof ToolNotFoundError) { - console.error('Tool not found:', error.message); - return null; - } - - if (error instanceof NotImplementedError) { - console.error('Feature not implemented:', error.message); - return null; - } - - // Network or API errors - if (error.message.includes('fetch')) { - console.error('Network error. Check connection.'); - return null; - } - - // Unknown error - console.error('Unexpected error:', error); - throw error; - } -}; -``` - -### Retry Logic - -```typescript -const retryWithBackoff = async ( - fn: () => Promise, - maxRetries = 3, - baseDelay = 1000 -): Promise => { - for (let attempt = 0; attempt < maxRetries; attempt++) { - try { - return await fn(); - } catch (error) { - if (attempt === maxRetries - 1) throw error; - - const delay = baseDelay * Math.pow(2, attempt); - console.log(`Retry ${attempt + 1}/${maxRetries} after ${delay}ms`); - await new Promise(resolve => setTimeout(resolve, delay)); - } - } - - throw new Error('Max retries exceeded'); -}; - -// Usage -const response = await retryWithBackoff(() => - agent('assistant').model('gpt-4').send('Hello') -); -``` - -### Circuit Breaker Pattern - -```typescript -class CircuitBreaker { - private failures = 0; - private lastFailureTime = 0; - private state: 'closed' | 'open' | 'half-open' = 'closed'; - - constructor( - private threshold: number = 5, - private timeout: number = 60000 - ) {} - - async execute(fn: () => Promise): Promise { - if (this.state === 'open') { - if (Date.now() - this.lastFailureTime > this.timeout) { - this.state = 'half-open'; - } else { - throw new Error('Circuit breaker is open'); - } - } - - try { - const result = await fn(); - this.onSuccess(); - return result; - } catch (error) { - this.onFailure(); - throw error; - } - } - - private onSuccess(): void { - this.failures = 0; - this.state = 'closed'; - } - - private onFailure(): void { - this.failures++; - this.lastFailureTime = Date.now(); - - if (this.failures >= this.threshold) { - this.state = 'open'; - } - } -} - -// Usage -const breaker = new CircuitBreaker(); - -try { - const response = await breaker.execute(() => - agent('assistant').model('gpt-4').send('Hello') - ); -} catch (error) { - console.error('Circuit breaker prevented execution'); -} -``` - -## Performance Optimization - -### Response Caching - -```typescript -interface CacheEntry { - response: AgentResponse; - timestamp: number; -} - -class ResponseCache { - private cache = new Map(); - - constructor(private ttl: number = 3600000) {} // 1 hour default - - get(key: string): AgentResponse | null { - const entry = this.cache.get(key); - if (!entry) return null; - - if (Date.now() - entry.timestamp > this.ttl) { - this.cache.delete(key); - return null; - } - - return entry.response; - } - - set(key: string, response: AgentResponse): void { - this.cache.set(key, { - response, - timestamp: Date.now() - }); - } - - clear(): void { - this.cache.clear(); - } -} - -// Usage -const cache = new ResponseCache(); - -const cachedAgent = async ( - agentInstance: Agent, - message: string -): Promise => { - const cacheKey = `${agentInstance.getConfig().name}:${message}`; - - const cached = cache.get(cacheKey); - if (cached) { - console.log('Cache hit'); - return cached; - } - - const response = await agentInstance.send(message); - cache.set(cacheKey, response); - return response; -}; -``` - -### Request Batching - -```typescript -class RequestBatcher { - private queue: Array<{ - message: string; - resolve: (response: AgentResponse) => void; - reject: (error: Error) => void; - }> = []; - - private timeout: NodeJS.Timeout | null = null; - - constructor( - private agent: Agent, - private batchSize: number = 5, - private batchDelay: number = 100 - ) {} - - async send(message: string): Promise { - return new Promise((resolve, reject) => { - this.queue.push({ message, resolve, reject }); - - if (this.queue.length >= this.batchSize) { - this.processBatch(); - } else if (!this.timeout) { - this.timeout = setTimeout(() => this.processBatch(), this.batchDelay); - } - }); - } - - private async processBatch(): Promise { - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - - const batch = this.queue.splice(0); - - // Process batch - for (const item of batch) { - try { - const response = await this.agent.send(item.message); - item.resolve(response); - } catch (error) { - item.reject(error as Error); - } - } - } -} -``` - -### Token Usage Optimization - -```typescript -const optimizeInstructions = (instructions: string): string => { - return instructions - .split('\n') - .map(line => line.trim()) - .filter(line => line.length > 0) - .join('\n'); -}; - -const efficientAgent = agent('efficient') - .model('gpt-4', { - temperature: 0.7, - maxTokens: 500 // Limit response size - }) - .instructions(optimizeInstructions(` - You are a helpful assistant. - Be concise. - Provide direct answers. - `)); -``` - -## Conversation Management - -### Conversation History - -```typescript -interface Message { - role: 'user' | 'assistant' | 'system'; - content: string; - timestamp: Date; -} - -class Conversation { - private history: Message[] = []; - - constructor(private agent: Agent) {} - - async send(message: string): Promise { - this.history.push({ - role: 'user', - content: message, - timestamp: new Date() - }); - - const response = await this.agent.send(message); - - this.history.push({ - role: 'assistant', - content: response.content, - timestamp: new Date() - }); - - return response; - } - - getHistory(): Message[] { - return [...this.history]; - } - - clear(): void { - this.history = []; - } - - export(): string { - return JSON.stringify(this.history, null, 2); - } - - import(json: string): void { - this.history = JSON.parse(json); - } -} - -// Usage -const conversation = new Conversation( - agent('assistant').model('gpt-4').instructions('Be helpful') -); - -await conversation.send('Hello'); -await conversation.send('What is TypeScript?'); - -console.log(conversation.getHistory()); -``` - -### Context Window Management - -```typescript -class ContextManager { - private maxTokens: number; - - constructor(maxTokens = 4000) { - this.maxTokens = maxTokens; - } - - // Approximate token count (4 chars โ‰ˆ 1 token) - private estimateTokens(text: string): number { - return Math.ceil(text.length / 4); - } - - truncateContext(messages: Message[]): Message[] { - let totalTokens = 0; - const result: Message[] = []; - - // Keep most recent messages - for (let i = messages.length - 1; i >= 0; i--) { - const tokens = this.estimateTokens(messages[i].content); - - if (totalTokens + tokens > this.maxTokens) { - break; - } - - totalTokens += tokens; - result.unshift(messages[i]); - } - - return result; - } -} -``` - -## Tool Composition - -### Tool Chains - -```typescript -const createToolChain = (tools: Tool[]) => { - return async (input: any) => { - let result = input; - - for (const tool of tools) { - result = await tool.execute(result); - } - - return result; - }; -}; - -// Usage -const readFile = tool(/* ... */); -const parseJSON = tool(/* ... */); -const validateData = tool(/* ... */); - -const chain = createToolChain([readFile, parseJSON, validateData]); -const result = await chain({ path: 'data.json' }); -``` - -### Conditional Tool Execution - -```typescript -const conditionalTool = ( - condition: (input: T) => boolean, - trueTool: Tool, - falseTool: Tool -) => { - return tool( - { - name: 'conditional', - description: 'Execute tool based on condition', - inputSchema: trueTool.schema - }, - async (input: T) => { - if (condition(input)) { - return trueTool.execute(input); - } - return falseTool.execute(input); - } - ); -}; -``` - -## Custom Model Adapters - -### Creating a Custom Adapter - -```typescript -import type { ModelProvider } from '@agentage/core'; - -class CustomModelAdapter implements ModelProvider { - constructor(private apiKey: string) {} - - async complete(params: { - model: string; - messages: Message[]; - temperature?: number; - }): Promise { - // Custom implementation - const response = await fetch('https://api.custom-llm.com/v1/chat', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.apiKey}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - model: params.model, - messages: params.messages, - temperature: params.temperature - }) - }); - - const data = await response.json(); - - return { - content: data.choices[0].message.content, - metadata: { - id: data.id, - model: data.model, - usage: data.usage - } - }; - } -} -``` - -## Configuration Management - -### Environment-Based Configuration - -```typescript -interface EnvironmentConfig { - openaiApiKey: string; - modelName: string; - temperature: number; - maxTokens: number; -} - -const loadConfig = (): EnvironmentConfig => { - return { - openaiApiKey: process.env.OPENAI_API_KEY || '', - modelName: process.env.MODEL_NAME || 'gpt-4', - temperature: parseFloat(process.env.TEMPERATURE || '0.7'), - maxTokens: parseInt(process.env.MAX_TOKENS || '1000', 10) - }; -}; - -const config = loadConfig(); - -const agent = agent('production-agent') - .model(config.modelName, { - temperature: config.temperature, - maxTokens: config.maxTokens - }) - .config([ - { key: 'OPENAI_API_KEY', value: config.openaiApiKey } - ]); -``` - -## Production Deployment - -### Health Checks - -```typescript -const healthCheck = async (agentInstance: Agent): Promise => { - try { - const response = await agentInstance.send('ping'); - return response.content !== ''; - } catch (error) { - console.error('Health check failed:', error); - return false; - } -}; -``` - -### Graceful Shutdown - -```typescript -class AgentService { - private isShuttingDown = false; - - async shutdown(): Promise { - this.isShuttingDown = true; - console.log('Shutting down gracefully...'); - - // Wait for ongoing requests - await this.waitForPendingRequests(); - - // Cleanup - this.cleanup(); - - console.log('Shutdown complete'); - } - - private async waitForPendingRequests(): Promise { - // Implementation - } - - private cleanup(): void { - // Close connections, clear caches, etc. - } -} -``` - -## Monitoring & Logging - -### Structured Logging - -```typescript -interface LogEntry { - timestamp: Date; - level: 'info' | 'warn' | 'error'; - message: string; - metadata?: Record; -} - -class Logger { - log(entry: LogEntry): void { - const formatted = JSON.stringify({ - ...entry, - timestamp: entry.timestamp.toISOString() - }); - console.log(formatted); - } -} - -const logger = new Logger(); - -// Usage -const response = await agent.send(message); -logger.log({ - timestamp: new Date(), - level: 'info', - message: 'Agent response received', - metadata: { - agentName: agent.getConfig().name, - messageLength: message.length, - responseLength: response.content.length, - usage: response.metadata?.usage - } -}); -``` - -### Performance Metrics - -```typescript -class MetricsCollector { - private metrics: Map = new Map(); - - record(name: string, value: number): void { - if (!this.metrics.has(name)) { - this.metrics.set(name, []); - } - this.metrics.get(name)!.push(value); - } - - getAverage(name: string): number { - const values = this.metrics.get(name) || []; - return values.reduce((a, b) => a + b, 0) / values.length; - } - - getP95(name: string): number { - const values = (this.metrics.get(name) || []).sort((a, b) => a - b); - const index = Math.floor(values.length * 0.95); - return values[index] || 0; - } -} - -const metrics = new MetricsCollector(); - -const start = Date.now(); -const response = await agent.send(message); -metrics.record('response_time', Date.now() - start); -``` - -## Security Best Practices - -### Input Sanitization - -```typescript -const sanitizeInput = (input: string): string => { - return input - .replace(/[<>]/g, '') // Remove HTML tags - .trim() - .slice(0, 5000); // Limit length -}; - -const safeAgent = async (message: string) => { - const sanitized = sanitizeInput(message); - return agent('secure').model('gpt-4').send(sanitized); -}; -``` - -### Rate Limiting - -```typescript -class RateLimiter { - private requests: number[] = []; - - constructor( - private maxRequests: number, - private windowMs: number - ) {} - - async acquire(): Promise { - const now = Date.now(); - this.requests = this.requests.filter(t => now - t < this.windowMs); - - if (this.requests.length >= this.maxRequests) { - const oldestRequest = this.requests[0]; - const waitTime = this.windowMs - (now - oldestRequest); - await new Promise(resolve => setTimeout(resolve, waitTime)); - } - - this.requests.push(Date.now()); - } -} - -const limiter = new RateLimiter(10, 60000); // 10 requests per minute - -await limiter.acquire(); -const response = await agent.send(message); -``` - ---- - -## Next Steps - -- [API Reference](./api-reference.md) - Complete API documentation -- [Tool Development](./tool-development.md) - Creating custom tools -- [Migration Guide](./migration.md) - Upgrading between versions - ---- - -**Need help?** Check out [GitHub Discussions](https://github.com/agentage/agentkit/discussions). diff --git a/docs/api-reference.md b/docs/api-reference.md deleted file mode 100644 index 6a35590..0000000 --- a/docs/api-reference.md +++ /dev/null @@ -1,752 +0,0 @@ -# API Reference - -Complete API documentation for AgentKit. - -## Table of Contents - -- [Installation](#installation) -- [Core Functions](#core-functions) - - [agent()](#agent) - - [tool()](#tool) -- [Types & Interfaces](#types--interfaces) - - [Agent](#agent-interface) - - [AgentConfig](#agentconfig) - - [AgentResponse](#agentresponse) - - [Tool](#tool-interface) - - [ModelConfig](#modelconfig) -- [Error Classes](#error-classes) -- [Examples](#examples) - -## Installation - -```bash -npm install @agentage/sdk -``` - -## Core Functions - -### agent() - -Creates an AI agent that can process messages and execute tools. - -#### Signature - -```typescript -function agent(name: string): Agent -function agent(config: AgentConfig): Agent -``` - -#### Parameters - -**Pattern 1: Builder (name string)** -- `name` (string): Name identifier for the agent - -**Pattern 2: Config (object)** -- `config` (AgentConfig): Complete agent configuration object - -#### Returns - -`Agent` - An agent instance with builder methods - -#### Examples - -**Builder Pattern** -```typescript -import { agent } from '@agentage/sdk'; - -const assistant = agent('my-assistant') - .model('gpt-4') - .instructions('You are helpful'); - -const response = await assistant.send('Hello'); -``` - -**Config Pattern** -```typescript -const assistant = agent({ - name: 'my-assistant', - model: 'gpt-4', - instructions: 'You are helpful' -}); - -const response = await assistant.send('Hello'); -``` - ---- - -### tool() - -Creates a tool that agents can execute with type-safe input validation. - -#### Signature - -```typescript -function tool( - config: CreateToolConfig, - execute: ToolExecuteFunction -): Tool, TResult> -``` - -#### Parameters - -- `config` (CreateToolConfig): Tool configuration - - `name` (string): Unique tool identifier - - `description` (string): What the tool does - - `inputSchema` (TSchema): Zod schema object defining inputs - - `title` (string, optional): Display name -- `execute` (ToolExecuteFunction): Async function that executes the tool - - Receives validated params matching schema - - Returns Promise with result - -#### Returns - -`Tool` - A tool instance that can be used by agents - -#### Examples - -**Simple Tool** -```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const calculator = tool( - { - name: 'calculator', - description: 'Perform basic math operations', - inputSchema: { - operation: z.enum(['add', 'subtract']), - a: z.number(), - b: z.number() - } - }, - async ({ operation, a, b }) => { - if (operation === 'add') return a + b; - return a - b; - } -); -``` - -**Tool with Optional Parameters** -```typescript -const searchTool = tool( - { - name: 'search', - description: 'Search for information', - inputSchema: { - query: z.string(), - limit: z.number().optional(), - type: z.enum(['web', 'images']).optional() - } - }, - async ({ query, limit = 10, type = 'web' }) => { - // Search implementation - return results; - } -); -``` - -**Tool with Error Handling** -```typescript -import { readFile } from 'fs/promises'; - -const fileReader = tool( - { - name: 'read_file', - description: 'Read a file from disk', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - try { - return await readFile(path, 'utf-8'); - } catch (error) { - throw new Error(`Failed to read ${path}: ${error.message}`); - } - } -); -``` - ---- - -## Types & Interfaces - -### Agent Interface - -The `Agent` interface provides methods for configuring and using agents. - -```typescript -interface Agent { - model(modelName: string, config?: ModelConfig): Agent; - instructions(text: string): Agent; - tools(toolList: Tool[]): Agent; - config(configEntries: ConfigEntry[]): Agent; - send(message: string): Promise; - stream(message: string): AsyncIterableIterator; -} -``` - -#### Methods - -##### `.model(modelName, config?)` - -Set the AI model to use. - -**Parameters:** -- `modelName` (string): Model identifier (e.g., 'gpt-4', 'gpt-3.5-turbo') -- `config` (ModelConfig, optional): Model configuration options - -**Returns:** Agent (for chaining) - -**Example:** -```typescript -agent('assistant') - .model('gpt-4', { - temperature: 0.7, - maxTokens: 1000 - }); -``` - -##### `.instructions(text)` - -Set the system instructions for the agent. - -**Parameters:** -- `text` (string): Instructions defining agent behavior - -**Returns:** Agent (for chaining) - -**Example:** -```typescript -agent('assistant') - .instructions('You are a helpful coding assistant. Provide clear examples.'); -``` - -##### `.tools(toolList)` - -Provide tools the agent can execute. - -**Parameters:** -- `toolList` (Tool[]): Array of tool instances - -**Returns:** Agent (for chaining) - -**Example:** -```typescript -agent('assistant') - .tools([searchTool, calculatorTool, fileReaderTool]); -``` - -##### `.config(configEntries)` - -Set configuration key-value pairs. - -**Parameters:** -- `configEntries` (ConfigEntry[]): Array of config objects - - `key` (string): Config key - - `value` (string): Config value - -**Returns:** Agent (for chaining) - -**Example:** -```typescript -agent('assistant') - .config([ - { key: 'OPENAI_API_KEY', value: 'sk-...' } - ]); -``` - -##### `.send(message)` - -Send a message to the agent and get a response. - -**Parameters:** -- `message` (string): User message to process - -**Returns:** Promise - -**Example:** -```typescript -const response = await agent('assistant') - .model('gpt-4') - .send('What is TypeScript?'); - -console.log(response.content); -``` - -##### `.stream(message)` - -Send a message and receive streaming responses (not yet implemented). - -**Parameters:** -- `message` (string): User message to process - -**Returns:** AsyncIterableIterator - -**Status:** Coming in future release - ---- - -### AgentConfig - -Configuration object for creating agents. - -```typescript -interface AgentConfig { - name: string; - model: string | ModelDefinition; - instructions?: string; - tools?: Tool[]; -} -``` - -#### Properties - -- `name` (string): Agent identifier -- `model` (string | ModelDefinition): Model name or full model definition - - String: `'gpt-4'` - - Object: `{ name: 'gpt-4', config: { temperature: 0.7 } }` -- `instructions` (string, optional): System instructions -- `tools` (Tool[], optional): Available tools - -#### Example - -```typescript -const config: AgentConfig = { - name: 'assistant', - model: { - name: 'gpt-4', - config: { - temperature: 0.7, - maxTokens: 1000 - } - }, - instructions: 'You are helpful', - tools: [searchTool] -}; - -const myAgent = agent(config); -``` - ---- - -### AgentResponse - -Response from agent execution. - -```typescript -interface AgentResponse { - content: string; - metadata?: Record; - data?: T; - toolCalls?: ToolCall[]; -} -``` - -#### Properties - -- `content` (string): The agent's text response -- `metadata` (Record, optional): Additional metadata - - `id`: Response ID - - `model`: Model used - - `usage`: Token usage statistics - - `finishReason`: Why the response ended -- `data` (T, optional): Structured data (if any) -- `toolCalls` (ToolCall[], optional): Tools that were executed - -#### Example - -```typescript -const response = await agent.send('Hello'); - -console.log(response.content); // "Hello! How can I help you?" -console.log(response.metadata?.usage); // { prompt_tokens: 10, ... } -``` - ---- - -### Tool Interface - -Tool definition with type safety. - -```typescript -interface Tool { - name: string; - description: string; - schema: ToolSchema; - execute: (params: TParams) => Promise; -} -``` - -#### Properties - -- `name` (string): Unique tool identifier -- `description` (string): What the tool does -- `schema` (ToolSchema): Input validation schema -- `execute` (function): Async function that runs the tool - ---- - -### ModelConfig - -Configuration options for AI models. - -```typescript -interface ModelConfig { - temperature?: number; - maxTokens?: number; - topP?: number; - frequencyPenalty?: number; - presencePenalty?: number; -} -``` - -#### Properties - -- `temperature` (number, 0.0-1.0): Randomness in responses - - `0.0`: Deterministic, focused - - `0.7`: Balanced (default) - - `1.0`: Creative, varied -- `maxTokens` (number): Maximum tokens in response -- `topP` (number, 0.0-1.0): Nucleus sampling threshold -- `frequencyPenalty` (number, -2.0-2.0): Reduce repetition -- `presencePenalty` (number, -2.0-2.0): Encourage new topics - -#### Example - -```typescript -const config: ModelConfig = { - temperature: 0.7, - maxTokens: 1000, - topP: 0.9, - frequencyPenalty: 0.5, - presencePenalty: 0.2 -}; - -agent('assistant').model('gpt-4', config); -``` - ---- - -### ModelDefinition - -Full model specification. - -```typescript -interface ModelDefinition { - name: string; - config?: ModelConfig; -} -``` - -#### Properties - -- `name` (string): Model identifier -- `config` (ModelConfig, optional): Model parameters - -#### Example - -```typescript -const modelDef: ModelDefinition = { - name: 'gpt-4', - config: { - temperature: 0.7 - } -}; -``` - ---- - -### CreateToolConfig - -Configuration for creating tools. - -```typescript -interface CreateToolConfig { - name: string; - title?: string; - description: string; - inputSchema: TSchema; -} -``` - -#### Properties - -- `name` (string): Unique identifier -- `title` (string, optional): Display name -- `description` (string): Tool purpose and usage -- `inputSchema` (TSchema): Zod schema object - ---- - -### ToolExecuteFunction - -Function type for tool execution. - -```typescript -type ToolExecuteFunction = ( - params: InferSchemaType -) => Promise -``` - -#### Parameters - -- `params`: Validated input matching schema - -#### Returns - -Promise with tool result - ---- - -## Error Classes - -### MissingApiKeyError - -Thrown when OpenAI API key is not configured. - -```typescript -class MissingApiKeyError extends Error { - code: 'MISSING_API_KEY'; -} -``` - -**Solution**: Set `OPENAI_API_KEY` environment variable or use `.config()`. - ---- - -### UnsupportedModelError - -Thrown when using an unsupported model. - -```typescript -class UnsupportedModelError extends Error { - code: 'UNSUPPORTED_MODEL'; -} -``` - -**Solution**: Use supported models (gpt-4, gpt-3.5-turbo). - ---- - -### ToolNotFoundError - -Thrown when agent tries to execute a tool that doesn't exist. - -```typescript -class ToolNotFoundError extends Error { - code: 'TOOL_NOT_FOUND'; -} -``` - ---- - -### NotImplementedError - -Thrown when using features not yet implemented. - -```typescript -class NotImplementedError extends Error { - code: 'NOT_IMPLEMENTED'; -} -``` - ---- - -## Examples - -### Basic Agent - -```typescript -import { agent } from '@agentage/sdk'; - -const assistant = agent('assistant') - .model('gpt-4') - .instructions('Be helpful and concise'); - -const response = await assistant.send('What is Node.js?'); -console.log(response.content); -``` - -### Agent with Tools - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const weatherTool = tool( - { - name: 'get_weather', - description: 'Get current weather for a location', - inputSchema: { - location: z.string(), - units: z.enum(['celsius', 'fahrenheit']).optional() - } - }, - async ({ location, units = 'celsius' }) => { - // Fetch weather data - return { temp: 22, units, location }; - } -); - -const assistant = agent('weather-bot') - .model('gpt-4') - .instructions('Help users with weather information') - .tools([weatherTool]); - -const response = await assistant.send('What is the weather in London?'); -console.log(response.content); -``` - -### Custom Model Configuration - -```typescript -const creative = agent('writer') - .model('gpt-4', { - temperature: 0.9, - maxTokens: 2000, - topP: 1.0, - presencePenalty: 0.6 - }) - .instructions('Write creative content'); - -const factual = agent('researcher') - .model('gpt-4', { - temperature: 0.1, - maxTokens: 1000, - frequencyPenalty: 0.5 - }) - .instructions('Provide factual information'); -``` - -### Error Handling - -```typescript -import { MissingApiKeyError, UnsupportedModelError } from '@agentage/sdk'; - -try { - const response = await agent('test') - .model('gpt-4') - .send('Hello'); - - console.log(response.content); -} catch (error) { - if (error instanceof MissingApiKeyError) { - console.error('API key not configured'); - } else if (error instanceof UnsupportedModelError) { - console.error('Unsupported model:', error.message); - } else { - console.error('Unknown error:', error); - } -} -``` - -### Config Pattern - -```typescript -import { agent } from '@agentage/sdk'; -import type { AgentConfig } from '@agentage/sdk'; - -const config: AgentConfig = { - name: 'assistant', - model: { - name: 'gpt-4', - config: { - temperature: 0.7, - maxTokens: 1000 - } - }, - instructions: 'You are a helpful assistant', - tools: [searchTool, calculatorTool] -}; - -const myAgent = agent(config); -const response = await myAgent.send('Help me'); -``` - -### Multiple Tools - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; -import { readFile, writeFile } from 'fs/promises'; - -const read = tool( - { - name: 'read_file', - description: 'Read file contents', - inputSchema: { path: z.string() } - }, - async ({ path }) => await readFile(path, 'utf-8') -); - -const write = tool( - { - name: 'write_file', - description: 'Write file contents', - inputSchema: { - path: z.string(), - content: z.string() - } - }, - async ({ path, content }) => { - await writeFile(path, content, 'utf-8'); - return 'Success'; - } -); - -const fileAgent = agent('file-manager') - .model('gpt-4') - .instructions('Help manage files') - .tools([read, write]); - -await fileAgent.send('Read package.json and create a summary'); -``` - ---- - -## Type Inference - -AgentKit provides full TypeScript type inference: - -```typescript -import { z } from 'zod'; - -// Schema defines the types -const myTool = tool( - { - name: 'example', - description: 'Example tool', - inputSchema: { - name: z.string(), - age: z.number(), - active: z.boolean().optional() - } - }, - // Parameters are automatically typed! - async ({ name, age, active }) => { - // name: string - // age: number - // active: boolean | undefined - return { name, age, active }; - } -); -``` - ---- - -## Version - -```typescript -import { version } from '@agentage/sdk'; -console.log(version); // "0.1.2" -``` - ---- - -## See Also - -- [Getting Started Guide](./getting-started.md) -- [Tool Development Guide](./tool-development.md) -- [Advanced Usage](./advanced-usage.md) -- [GitHub Repository](https://github.com/agentage/agentkit) diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100644 index 354f2fd..0000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,524 +0,0 @@ -# Getting Started with AgentKit - -Build your first AI agent in 5 minutes! This guide walks you through everything you need to get started with AgentKit. - -## Prerequisites - -Before you begin, ensure you have: - -- **Node.js**: Version 20.0.0 or higher ([download](https://nodejs.org/)) -- **npm**: Version 10.0.0 or higher (comes with Node.js) -- **OpenAI API key**: Get one from [OpenAI Platform](https://platform.openai.com/api-keys) - -Check your versions: -```bash -node --version # Should be v20.0.0 or higher -npm --version # Should be 10.0.0 or higher -``` - -## Installation - -### SDK Installation - -Install the AgentKit SDK in your project: - -```bash -npm install @agentage/sdk -``` - -For environment variable support: -```bash -npm install dotenv -``` - -## Your First Agent (SDK) - -Let's build a simple AI assistant using the SDK. - -### Step 1: Create a Project - -```bash -mkdir my-first-agent -cd my-first-agent -npm init -y -npm install @agentage/sdk dotenv -``` - -### Step 2: Set Up Environment - -Create a `.env` file in your project root: - -```env -OPENAI_API_KEY=sk-your-api-key-here -``` - -**Important**: Add `.env` to your `.gitignore` to avoid committing your API key: -```bash -echo ".env" >> .gitignore -``` - -### Step 3: Create Your Agent - -Create `index.js`: - -```javascript -import { agent } from '@agentage/sdk'; -import 'dotenv/config'; - -const assistant = agent('my-assistant') - .model('gpt-4') - .instructions('You are a helpful assistant. Be concise and friendly.'); - -const response = await assistant.send('Hello! What can you help me with?'); -console.log(response.content); -``` - -### Step 4: Run Your Agent - -```bash -node index.js -``` - -You should see a response from your agent! ๐ŸŽ‰ - -### Step 5: Try More Interactions - -Update your `index.js` to have a conversation: - -```javascript -import { agent } from '@agentage/sdk'; -import 'dotenv/config'; - -const assistant = agent('my-assistant') - .model('gpt-4') - .instructions('You are a helpful assistant. Be concise and friendly.'); - -// First message -const response1 = await assistant.send('What is TypeScript?'); -console.log('Agent:', response1.content); - -// Follow-up message -const response2 = await assistant.send('How is it different from JavaScript?'); -console.log('Agent:', response2.content); -``` - -## Adding Tools to Your Agent - -Tools allow agents to perform actions like reading files, calling APIs, or performing calculations. - -### Define a Tool - -Create `tools.js`: - -```javascript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; -import { readFile } from 'fs/promises'; - -export const fileReaderTool = tool( - { - name: 'read_file', - description: 'Read the contents of a file from the filesystem', - inputSchema: { - path: z.string().describe('The file path to read') - } - }, - async ({ path }) => { - try { - const content = await readFile(path, 'utf-8'); - return content; - } catch (error) { - throw new Error(`Failed to read file: ${error.message}`); - } - } -); - -export const calculatorTool = tool( - { - name: 'calculator', - description: 'Perform mathematical calculations', - inputSchema: { - operation: z.enum(['add', 'subtract', 'multiply', 'divide']), - a: z.number().describe('First number'), - b: z.number().describe('Second number') - } - }, - async ({ operation, a, b }) => { - switch (operation) { - case 'add': - return a + b; - case 'subtract': - return a - b; - case 'multiply': - return a * b; - case 'divide': - if (b === 0) throw new Error('Division by zero'); - return a / b; - } - } -); -``` - -### Use Tools in Your Agent - -Create `agent-with-tools.js`: - -```javascript -import { agent } from '@agentage/sdk'; -import { fileReaderTool, calculatorTool } from './tools.js'; -import 'dotenv/config'; - -const codeReviewer = agent('code-reviewer') - .model('gpt-4') - .instructions('You are a code reviewer. Analyze files for issues and improvements.') - .tools([fileReaderTool, calculatorTool]); - -const review = await codeReviewer.send('Review the package.json file'); -console.log(review.content); -``` - -Run it: -```bash -node agent-with-tools.js -``` - -The agent will use the `read_file` tool to read `package.json` and provide a review! - -## Model Configuration - -Customize how your agent behaves by adjusting model parameters. - -### Temperature Control - -Temperature controls randomness (0.0 = deterministic, 1.0 = creative): - -```javascript -// More creative responses -const creativeAgent = agent('writer') - .model('gpt-4', { - temperature: 0.9 - }) - .instructions('Write creative and engaging content'); - -// More deterministic responses -const analyzerAgent = agent('analyzer') - .model('gpt-4', { - temperature: 0.1 - }) - .instructions('Provide precise, factual analysis'); -``` - -### Token Limits - -Control response length with `max_tokens`: - -```javascript -const summarizer = agent('summarizer') - .model('gpt-4', { - max_tokens: 500, - temperature: 0.7 - }) - .instructions('Summarize content concisely'); -``` - -### All Configuration Options - -```javascript -const agent = agent('configured') - .model('gpt-4', { - temperature: 0.7, // 0.0-1.0: creativity level - max_tokens: 1000, // Maximum tokens in response - top_p: 1.0, // Nucleus sampling - frequency_penalty: 0.0, // Reduce repetition - presence_penalty: 0.0 // Encourage new topics - }); -``` - -## Pattern Comparison - -AgentKit supports two API patterns - choose the one you prefer! - -### Builder Pattern (Chainable) - -```javascript -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are helpful') - .tools([tool1, tool2]); - -await assistant.send('Hello'); -``` - -**Pros**: -- Fluent, readable -- Easy to build incrementally -- Similar to Express.js - -### Config Pattern (Object) - -```javascript -const assistant = agent({ - name: 'assistant', - model: { - name: 'gpt-4', - config: { temperature: 0.7 } - }, - instructions: 'You are helpful', - tools: [tool1, tool2] -}); - -await assistant.send('Hello'); -``` - -**Pros**: -- All configuration in one place -- Easy to load from JSON/YAML -- Good for serialization - -Both patterns produce identical results! - -## Project Structure - -Here's a recommended project structure: - -``` -my-agent-project/ -โ”œโ”€โ”€ .env # Environment variables (API keys) -โ”œโ”€โ”€ .gitignore # Git ignore (.env, node_modules) -โ”œโ”€โ”€ package.json # Dependencies -โ”œโ”€โ”€ index.js # Main entry point -โ”œโ”€โ”€ agents/ # Agent definitions (YAML) -โ”‚ โ”œโ”€โ”€ assistant.yml -โ”‚ โ””โ”€โ”€ reviewer.yml -โ”œโ”€โ”€ tools/ # Tool definitions -โ”‚ โ”œโ”€โ”€ file-tools.js -โ”‚ โ”œโ”€โ”€ api-tools.js -โ”‚ โ””โ”€โ”€ index.js -โ””โ”€โ”€ src/ # Application code - โ”œโ”€โ”€ agents/ # Agent configurations - โ””โ”€โ”€ utils/ # Utilities -``` - -## TypeScript Setup - -For TypeScript projects: - -### 1. Install TypeScript Dependencies - -```bash -npm install -D typescript @types/node -npm install @agentage/sdk -``` - -### 2. Create `tsconfig.json` - -```json -{ - "compilerOptions": { - "target": "ES2022", - "module": "ES2022", - "moduleResolution": "node", - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true, - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["node_modules"] -} -``` - -### 3. Update `package.json` - -```json -{ - "type": "module", - "scripts": { - "build": "tsc", - "start": "node dist/index.js", - "dev": "tsc && node dist/index.js" - } -} -``` - -### 4. Create `src/index.ts` - -```typescript -import { agent } from '@agentage/sdk'; -import 'dotenv/config'; - -const assistant = agent('assistant') - .model('gpt-4') - .instructions('You are a helpful assistant'); - -const response = await assistant.send('Hello!'); -console.log(response.content); -``` - -### 5. Build and Run - -```bash -npm run dev -``` - -## Complete Example - -Here's a complete, production-ready example: - -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; -import { readFile, writeFile } from 'fs/promises'; -import 'dotenv/config'; - -// Define tools -const readFileTool = tool( - { - name: 'read_file', - description: 'Read a file from disk', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - return await readFile(path, 'utf-8'); - } -); - -const writeFileTool = tool( - { - name: 'write_file', - description: 'Write content to a file', - inputSchema: { - path: z.string(), - content: z.string() - } - }, - async ({ path, content }) => { - await writeFile(path, content, 'utf-8'); - return `File written successfully to ${path}`; - } -); - -// Create agent -const fileAgent = agent('file-assistant') - .model('gpt-4', { temperature: 0.3 }) - .instructions(` - You are a file management assistant. - Help users read, write, and manage files. - Always confirm actions before executing them. - `) - .tools([readFileTool, writeFileTool]); - -// Use agent -const main = async () => { - try { - const result = await fileAgent.send( - 'Read package.json and create a summary in summary.txt' - ); - console.log(result.content); - } catch (error) { - console.error('Error:', error.message); - } -}; - -main(); -``` - -## Next Steps - -Now that you've built your first agent, explore more: - -- **[Tool Development](./tool-development.md)** - Create powerful custom tools -- **[API Reference](./api-reference.md)** - Complete API documentation -- **[Advanced Usage](./advanced-usage.md)** - Advanced patterns and techniques -- **[Examples](../examples/)** - More working examples - -## Common Patterns - -### Error Handling - -```typescript -try { - const result = await agent.send('message'); - console.log(result.content); -} catch (error) { - if (error.code === 'OPENAI_API_ERROR') { - console.error('API Error:', error.message); - } else { - console.error('Unknown Error:', error); - } -} -``` - -### Conversation Loop - -```typescript -import * as readline from 'readline'; - -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -const chat = async () => { - rl.question('You: ', async (message) => { - if (message.toLowerCase() === 'exit') { - rl.close(); - return; - } - - const response = await assistant.send(message); - console.log('Agent:', response.content); - chat(); - }); -}; - -chat(); -``` - -### Multiple Agents - -```typescript -const researcher = agent('researcher') - .model('gpt-4') - .instructions('Research topics thoroughly'); - -const writer = agent('writer') - .model('gpt-4') - .instructions('Write clear, engaging content'); - -// Use them together -const research = await researcher.send('Research AI trends'); -const article = await writer.send(`Write an article about: ${research.content}`); -``` - -## Troubleshooting - -### Issue: "Cannot find module '@agentage/sdk'" - -**Solution**: Make sure you've installed the package: -```bash -npm install @agentage/sdk -``` - -### Issue: "OpenAI API key not found" - -**Solution**: Set your API key in `.env`: -```env -OPENAI_API_KEY=sk-your-key-here -``` - -### Issue: "Module not found" errors in TypeScript - -**Solution**: Set `"moduleResolution": "node"` in `tsconfig.json` - -### Need More Help? - -- [Troubleshooting Guide](../README.md#troubleshooting) -- [GitHub Issues](https://github.com/agentage/agentkit/issues) -- [GitHub Discussions](https://github.com/agentage/agentkit/discussions) - ---- - -**Congratulations!** You've built your first AI agent. Continue learning in the [Tool Development Guide](./tool-development.md). diff --git a/docs/migration.md b/docs/migration.md deleted file mode 100644 index 244a97a..0000000 --- a/docs/migration.md +++ /dev/null @@ -1,468 +0,0 @@ -# Migration Guide - -Guide for upgrading between AgentKit versions. - -## Table of Contents - -- [Version 0.1.x to 0.2.x](#version-01x-to-02x) -- [Version 0.0.x to 0.1.x](#version-00x-to-01x) -- [General Migration Tips](#general-migration-tips) - -## Version 0.1.x to 0.2.x - -**Status**: Future release (not yet available) - -### Planned Changes - -The following changes are planned for version 0.2.x: - -#### Streaming Support - -```typescript -// v0.1.x - Not supported -// throws NotImplementedError - -// v0.2.x - Streaming will be available -const agent = agent('assistant').model('gpt-4'); - -for await (const chunk of agent.stream('Hello')) { - process.stdout.write(chunk.content); -} -``` - -#### Enhanced Tool Types - -```typescript -// v0.1.x -const tool = tool({ /* ... */ }, async (params) => { /* ... */ }); - -// v0.2.x - Additional tool metadata -const tool = tool({ - name: 'my_tool', - description: 'Tool description', - category: 'utility', // NEW - tags: ['file', 'io'], // NEW - version: '1.0.0', // NEW - inputSchema: { /* ... */ } -}, async (params) => { /* ... */ }); -``` - -#### Breaking Changes (Planned) - -None planned for 0.2.x. The release will be backward compatible. - -## Version 0.0.x to 0.1.x - -### Breaking Changes - -#### 1. Package Imports - -**Before (0.0.x)**: -```typescript -import { createAgent } from '@agentage/sdk'; -``` - -**After (0.1.x)**: -```typescript -import { agent } from '@agentage/sdk'; -``` - -#### 2. Agent Creation API - -**Before (0.0.x)**: -```typescript -const myAgent = createAgent({ - name: 'assistant', - modelName: 'gpt-4', - systemPrompt: 'You are helpful' -}); -``` - -**After (0.1.x)** - Builder Pattern: -```typescript -const myAgent = agent('assistant') - .model('gpt-4') - .instructions('You are helpful'); -``` - -**After (0.1.x)** - Config Pattern: -```typescript -const myAgent = agent({ - name: 'assistant', - model: 'gpt-4', - instructions: 'You are helpful' -}); -``` - -#### 3. Tool Definition - -**Before (0.0.x)**: -```typescript -const myTool = { - name: 'my_tool', - description: 'Description', - parameters: { - param1: { type: 'string' } - }, - execute: async (params) => { /* ... */ } -}; -``` - -**After (0.1.x)**: -```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const myTool = tool( - { - name: 'my_tool', - description: 'Description', - inputSchema: { - param1: z.string() - } - }, - async (params) => { /* ... */ } -); -``` - -#### 4. Response Format - -**Before (0.0.x)**: -```typescript -const response = await agent.send('Hello'); -// response: string -console.log(response); -``` - -**After (0.1.x)**: -```typescript -const response = await agent.send('Hello'); -// response: AgentResponse -console.log(response.content); -console.log(response.metadata); -``` - -### Migration Steps - -#### Step 1: Update Dependencies - -```bash -npm install @agentage/sdk@latest -npm install zod # Required for tool schemas -``` - -#### Step 2: Update Imports - -Replace: -```typescript -import { createAgent, createTool } from '@agentage/sdk'; -``` - -With: -```typescript -import { agent, tool } from '@agentage/sdk'; -``` - -#### Step 3: Update Agent Creation - -**Old Code**: -```typescript -const assistant = createAgent({ - name: 'assistant', - modelName: 'gpt-4', - systemPrompt: 'You are helpful', - temperature: 0.7 -}); -``` - -**New Code** (choose one pattern): -```typescript -// Builder pattern -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are helpful'); - -// OR Config pattern -const assistant = agent({ - name: 'assistant', - model: { - name: 'gpt-4', - config: { temperature: 0.7 } - }, - instructions: 'You are helpful' -}); -``` - -#### Step 4: Update Tool Definitions - -**Old Code**: -```typescript -const readFile = { - name: 'read_file', - description: 'Read a file', - parameters: { - path: { type: 'string', required: true } - }, - execute: async ({ path }) => { - return await fs.readFile(path, 'utf-8'); - } -}; -``` - -**New Code**: -```typescript -import { z } from 'zod'; - -const readFile = tool( - { - name: 'read_file', - description: 'Read a file', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - return await fs.readFile(path, 'utf-8'); - } -); -``` - -#### Step 5: Update Response Handling - -**Old Code**: -```typescript -const response = await agent.send('Hello'); -console.log(response); // Direct string -``` - -**New Code**: -```typescript -const response = await agent.send('Hello'); -console.log(response.content); // Message content -console.log(response.metadata); // Additional metadata -``` - -### Complete Example Migration - -**Before (0.0.x)**: -```typescript -import { createAgent } from '@agentage/sdk'; - -const assistant = createAgent({ - name: 'assistant', - modelName: 'gpt-4', - systemPrompt: 'You are helpful', - temperature: 0.7, - tools: [ - { - name: 'search', - description: 'Search', - parameters: { - query: { type: 'string', required: true } - }, - execute: async ({ query }) => { - return searchResults(query); - } - } - ] -}); - -const response = await assistant.send('Search for AI'); -console.log(response); -``` - -**After (0.1.x)**: -```typescript -import { agent, tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const searchTool = tool( - { - name: 'search', - description: 'Search', - inputSchema: { - query: z.string() - } - }, - async ({ query }) => { - return searchResults(query); - } -); - -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are helpful') - .tools([searchTool]); - -const response = await assistant.send('Search for AI'); -console.log(response.content); -``` - -## General Migration Tips - -### 1. Test Incrementally - -Migrate one agent or tool at a time and test thoroughly: - -```typescript -// Keep old version running -const oldAgent = createAgent({ /* ... */ }); // 0.0.x - -// Test new version alongside -const newAgent = agent('test') // 0.1.x - .model('gpt-4') - .instructions('...'); - -// Compare results -const oldResult = await oldAgent.send('test'); -const newResult = await newAgent.send('test'); -``` - -### 2. Use Type Checking - -Enable strict TypeScript mode to catch migration issues: - -```json -{ - "compilerOptions": { - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true - } -} -``` - -### 3. Update Tests - -Update your test files to use the new API: - -```typescript -// Old test -describe('agent', () => { - it('should respond', async () => { - const agent = createAgent({ /* ... */ }); - const response = await agent.send('test'); - expect(response).toBe('...'); - }); -}); - -// New test -describe('agent', () => { - it('should respond', async () => { - const myAgent = agent('test').model('gpt-4'); - const response = await myAgent.send('test'); - expect(response.content).toBe('...'); - }); -}); -``` - -### 4. Check Dependencies - -Ensure all dependencies are compatible: - -```bash -npm list @agentage/sdk -npm list zod -npm outdated -``` - -### 5. Review Changelog - -Always review the [CHANGELOG.md](../CHANGELOG.md) for detailed information about changes. - -### 6. Gradual Migration - -For large codebases, consider a gradual migration: - -1. Update dependencies -2. Migrate utility functions -3. Migrate tools -4. Migrate agents -5. Update tests -6. Deploy incrementally - -### 7. Backup Before Migration - -```bash -git checkout -b migration-to-0.1.x -git add . -git commit -m "chore: backup before migration" -``` - -### 8. Use Codemods (Future) - -We plan to provide codemods for automated migration in future releases. - -## Common Issues - -### Issue 1: Type Errors with Tool Schemas - -**Problem**: -```typescript -// Error: Type 'ZodString' is not assignable to type 'ToolSchema' -const tool = tool({ - inputSchema: z.string() // Wrong! -}, /* ... */); -``` - -**Solution**: -```typescript -// Use object with Zod schemas -const tool = tool({ - inputSchema: { - param: z.string() // Correct! - } -}, /* ... */); -``` - -### Issue 2: Response Content Undefined - -**Problem**: -```typescript -const response = await agent.send('Hello'); -console.log(response); // Logs object, not string -``` - -**Solution**: -```typescript -const response = await agent.send('Hello'); -console.log(response.content); // Access .content property -``` - -### Issue 3: Model Configuration - -**Problem**: -```typescript -// Old way doesn't work -agent.model('gpt-4').temperature(0.7); -``` - -**Solution**: -```typescript -// Pass config as second parameter -agent.model('gpt-4', { temperature: 0.7 }); -``` - -## Deprecation Warnings - -No features are currently deprecated. All v0.1.x APIs will be supported in v0.2.x. - -## Getting Help - -If you encounter issues during migration: - -- **GitHub Issues**: [Report migration issues](https://github.com/agentage/agentkit/issues) -- **GitHub Discussions**: [Ask questions](https://github.com/agentage/agentkit/discussions) -- **Documentation**: [Full docs](./README.md) -- **Examples**: [Working examples](../examples/) - -## Version Support - -| Version | Status | Support End | -|---------|--------|-------------| -| 0.1.x | Current | Active | -| 0.0.x | Deprecated | 2024-12-31 | - ---- - -**Questions?** Open a [discussion](https://github.com/agentage/agentkit/discussions) for migration help. diff --git a/docs/tool-development.md b/docs/tool-development.md deleted file mode 100644 index a20b94c..0000000 --- a/docs/tool-development.md +++ /dev/null @@ -1,879 +0,0 @@ -# Tool Development Guide - -Learn how to create powerful, type-safe tools for your AI agents. - -## Table of Contents - -- [What Are Tools?](#what-are-tools) -- [Basic Tool Creation](#basic-tool-creation) -- [Tool Schema Design](#tool-schema-design) -- [Type Safety](#type-safety) -- [Error Handling](#error-handling) -- [Best Practices](#best-practices) -- [Common Patterns](#common-patterns) -- [Real-World Examples](#real-world-examples) -- [Testing Tools](#testing-tools) - -## What Are Tools? - -Tools extend your agent's capabilities by providing executable functions. When an agent needs to perform an action (like reading a file, calling an API, or calculating something), it can use tools. - -### Key Benefits - -- **Type-safe**: Automatic validation with Zod schemas -- **Composable**: Combine multiple tools -- **Reusable**: Share tools across agents -- **Testable**: Easy to unit test - -### How Tools Work - -1. **Define**: Create tool with schema and execution function -2. **Provide**: Give tool to agent via `.tools()` -3. **Execute**: Agent decides when to call tool -4. **Return**: Tool returns result to agent -5. **Continue**: Agent uses result to formulate response - -## Basic Tool Creation - -### Minimal Example - -```typescript -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -const greetTool = tool( - { - name: 'greet', - description: 'Greet a person by name', - inputSchema: { - name: z.string() - } - }, - async ({ name }) => { - return `Hello, ${name}!`; - } -); -``` - -### Anatomy of a Tool - -```typescript -const myTool = tool( - // Configuration - { - name: 'tool_name', // Unique identifier - description: 'What it does', // Clear description - inputSchema: { // Zod schema object - param1: z.string(), - param2: z.number().optional() - } - }, - // Execution function - async (params) => { - // params is typed automatically! - // params.param1 is string - // params.param2 is number | undefined - return result; - } -); -``` - -## Tool Schema Design - -### Required Parameters - -```typescript -const searchTool = tool( - { - name: 'search', - description: 'Search for information', - inputSchema: { - query: z.string(), - type: z.enum(['web', 'images', 'news']) - } - }, - async ({ query, type }) => { - // Both parameters are required - return performSearch(query, type); - } -); -``` - -### Optional Parameters - -```typescript -const fetchTool = tool( - { - name: 'fetch_url', - description: 'Fetch data from a URL', - inputSchema: { - url: z.string(), - method: z.enum(['GET', 'POST']).optional(), - headers: z.record(z.string()).optional(), - timeout: z.number().optional() - } - }, - async ({ url, method = 'GET', headers = {}, timeout = 5000 }) => { - // Use defaults for optional parameters - return fetch(url, { method, headers, timeout }); - } -); -``` - -### Complex Schemas - -```typescript -const createUserTool = tool( - { - name: 'create_user', - description: 'Create a new user account', - inputSchema: { - username: z.string().min(3).max(20), - email: z.string().email(), - age: z.number().min(13).max(120).optional(), - role: z.enum(['user', 'admin']).default('user'), - tags: z.array(z.string()).optional(), - metadata: z.record(z.unknown()).optional() - } - }, - async (params) => { - // All validation happens automatically - return createUser(params); - } -); -``` - -### Nested Objects - -```typescript -const orderTool = tool( - { - name: 'create_order', - description: 'Create a new order', - inputSchema: { - customer: z.object({ - name: z.string(), - email: z.string().email() - }), - items: z.array( - z.object({ - productId: z.string(), - quantity: z.number().positive(), - price: z.number().positive() - }) - ), - shipping: z.object({ - address: z.string(), - city: z.string(), - zipCode: z.string() - }).optional() - } - }, - async ({ customer, items, shipping }) => { - return createOrder({ customer, items, shipping }); - } -); -``` - -## Type Safety - -### Automatic Type Inference - -```typescript -const myTool = tool( - { - name: 'example', - description: 'Example with type inference', - inputSchema: { - name: z.string(), - count: z.number(), - active: z.boolean().optional() - } - }, - // Types are inferred automatically! - async ({ name, count, active }) => { - // name is string - // count is number - // active is boolean | undefined - - // TypeScript knows the types - const upperName: string = name.toUpperCase(); - const doubled: number = count * 2; - const status: boolean = active ?? false; - - return { upperName, doubled, status }; - } -); -``` - -### Generic Return Types - -```typescript -interface SearchResult { - title: string; - url: string; - snippet: string; -} - -const searchTool = tool( - { - name: 'search', - description: 'Search the web', - inputSchema: { - query: z.string() - } - }, - async ({ query }): Promise => { - // Return type is enforced - return [ - { - title: 'Result 1', - url: 'https://example.com', - snippet: 'Description' - } - ]; - } -); -``` - -## Error Handling - -### Basic Error Handling - -```typescript -import { readFile } from 'fs/promises'; - -const fileReader = tool( - { - name: 'read_file', - description: 'Read a file from disk', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - try { - return await readFile(path, 'utf-8'); - } catch (error) { - throw new Error(`Failed to read file: ${error.message}`); - } - } -); -``` - -### Custom Error Types - -```typescript -class ToolExecutionError extends Error { - constructor( - message: string, - public readonly code: string, - public readonly details?: unknown - ) { - super(message); - this.name = 'ToolExecutionError'; - } -} - -const apiTool = tool( - { - name: 'call_api', - description: 'Call external API', - inputSchema: { - endpoint: z.string() - } - }, - async ({ endpoint }) => { - try { - const response = await fetch(endpoint); - - if (!response.ok) { - throw new ToolExecutionError( - 'API request failed', - 'API_ERROR', - { - status: response.status, - statusText: response.statusText - } - ); - } - - return await response.json(); - } catch (error) { - if (error instanceof ToolExecutionError) { - throw error; - } - throw new ToolExecutionError( - 'Network error', - 'NETWORK_ERROR', - { originalError: error.message } - ); - } - } -); -``` - -### Validation Errors - -```typescript -const safeTool = tool( - { - name: 'safe_division', - description: 'Divide two numbers safely', - inputSchema: { - numerator: z.number(), - denominator: z.number() - } - }, - async ({ numerator, denominator }) => { - // Custom validation beyond schema - if (denominator === 0) { - throw new Error('Cannot divide by zero'); - } - - if (!Number.isFinite(numerator) || !Number.isFinite(denominator)) { - throw new Error('Inputs must be finite numbers'); - } - - return numerator / denominator; - } -); -``` - -## Best Practices - -### 1. Clear Descriptions - -```typescript -// โŒ Bad: Vague description -const tool1 = tool( - { - name: 'do_stuff', - description: 'Does things', - inputSchema: { data: z.unknown() } - }, - async ({ data }) => { /* ... */ } -); - -// โœ… Good: Clear, specific description -const tool2 = tool( - { - name: 'calculate_total', - description: 'Calculate the total price including tax and shipping', - inputSchema: { - subtotal: z.number().describe('Subtotal before tax'), - taxRate: z.number().describe('Tax rate as decimal (e.g., 0.08 for 8%)'), - shippingCost: z.number().describe('Flat shipping cost') - } - }, - async ({ subtotal, taxRate, shippingCost }) => { - return subtotal * (1 + taxRate) + shippingCost; - } -); -``` - -### 2. Use Schema Descriptions - -```typescript -const userTool = tool( - { - name: 'create_user', - description: 'Create a new user account in the system', - inputSchema: { - username: z.string() - .min(3) - .max(20) - .describe('Username between 3-20 characters'), - email: z.string() - .email() - .describe('Valid email address'), - age: z.number() - .min(13) - .optional() - .describe('User age (must be 13 or older)') - } - }, - async (params) => createUser(params) -); -``` - -### 3. Keep Tools Focused - -```typescript -// โŒ Bad: Tool does too much -const megaTool = tool( - { - name: 'do_everything', - description: 'Read files, write files, call APIs, send emails', - inputSchema: { /* complex schema */ } - }, - async (params) => { /* complex logic */ } -); - -// โœ… Good: Separate, focused tools -const readFile = tool({ /* ... */ }, async () => { /* ... */ }); -const writeFile = tool({ /* ... */ }, async () => { /* ... */ }); -const callAPI = tool({ /* ... */ }, async () => { /* ... */ }); -const sendEmail = tool({ /* ... */ }, async () => { /* ... */ }); -``` - -### 4. Return Useful Data - -```typescript -// โŒ Bad: Vague return value -const badTool = tool( - { - name: 'save', - description: 'Save something', - inputSchema: { data: z.unknown() } - }, - async ({ data }) => { - await save(data); - return 'ok'; // Not helpful - } -); - -// โœ… Good: Detailed return value -const goodTool = tool( - { - name: 'save_document', - description: 'Save a document to storage', - inputSchema: { - title: z.string(), - content: z.string() - } - }, - async ({ title, content }) => { - const doc = await saveDocument({ title, content }); - return { - id: doc.id, - title: doc.title, - createdAt: doc.createdAt, - url: doc.url - }; - } -); -``` - -### 5. Handle Edge Cases - -```typescript -const robustTool = tool( - { - name: 'fetch_data', - description: 'Fetch data from URL', - inputSchema: { - url: z.string().url() - } - }, - async ({ url }) => { - // Timeout protection - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 10000); - - try { - const response = await fetch(url, { - signal: controller.signal - }); - - // Check response - if (!response.ok) { - return { - success: false, - error: `HTTP ${response.status}: ${response.statusText}` - }; - } - - // Handle different content types - const contentType = response.headers.get('content-type'); - if (contentType?.includes('application/json')) { - return await response.json(); - } else { - return await response.text(); - } - } catch (error) { - if (error.name === 'AbortError') { - return { success: false, error: 'Request timeout' }; - } - return { success: false, error: error.message }; - } finally { - clearTimeout(timeout); - } - } -); -``` - -## Common Patterns - -### File Operations - -```typescript -import { readFile, writeFile, readdir, stat } from 'fs/promises'; -import { join } from 'path'; - -export const fileTools = { - read: tool( - { - name: 'read_file', - description: 'Read contents of a file', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => await readFile(path, 'utf-8') - ), - - write: tool( - { - name: 'write_file', - description: 'Write contents to a file', - inputSchema: { - path: z.string(), - content: z.string() - } - }, - async ({ path, content }) => { - await writeFile(path, content, 'utf-8'); - return { success: true, path }; - } - ), - - list: tool( - { - name: 'list_directory', - description: 'List files in a directory', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - const files = await readdir(path); - return files; - } - ), - - info: tool( - { - name: 'file_info', - description: 'Get information about a file', - inputSchema: { - path: z.string() - } - }, - async ({ path }) => { - const stats = await stat(path); - return { - size: stats.size, - created: stats.birthtime, - modified: stats.mtime, - isDirectory: stats.isDirectory(), - isFile: stats.isFile() - }; - } - ) -}; -``` - -### API Calls - -```typescript -const apiTool = tool( - { - name: 'github_api', - description: 'Call GitHub API', - inputSchema: { - endpoint: z.string(), - method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional(), - body: z.record(z.unknown()).optional() - } - }, - async ({ endpoint, method = 'GET', body }) => { - const url = `https://api.github.com${endpoint}`; - - const response = await fetch(url, { - method, - headers: { - 'Accept': 'application/vnd.github.v3+json', - 'Authorization': `token ${process.env.GITHUB_TOKEN}` - }, - body: body ? JSON.stringify(body) : undefined - }); - - if (!response.ok) { - throw new Error(`GitHub API error: ${response.statusText}`); - } - - return await response.json(); - } -); -``` - -### Database Operations - -```typescript -import { db } from './database'; - -const dbTools = { - query: tool( - { - name: 'db_query', - description: 'Query database', - inputSchema: { - table: z.string(), - where: z.record(z.unknown()).optional(), - limit: z.number().optional() - } - }, - async ({ table, where, limit = 100 }) => { - return await db.from(table).where(where).limit(limit); - } - ), - - insert: tool( - { - name: 'db_insert', - description: 'Insert record into database', - inputSchema: { - table: z.string(), - data: z.record(z.unknown()) - } - }, - async ({ table, data }) => { - const result = await db.into(table).insert(data); - return { id: result[0], ...data }; - } - ) -}; -``` - -### Calculation Tools - -```typescript -const mathTools = { - calculate: tool( - { - name: 'calculator', - description: 'Perform mathematical operations', - inputSchema: { - operation: z.enum(['add', 'subtract', 'multiply', 'divide', 'power', 'sqrt']), - a: z.number(), - b: z.number().optional() - } - }, - async ({ operation, a, b }) => { - switch (operation) { - case 'add': return a + (b ?? 0); - case 'subtract': return a - (b ?? 0); - case 'multiply': return a * (b ?? 1); - case 'divide': - if (b === 0) throw new Error('Division by zero'); - return a / (b ?? 1); - case 'power': return Math.pow(a, b ?? 2); - case 'sqrt': return Math.sqrt(a); - default: throw new Error('Unknown operation'); - } - } - ), - - statistics: tool( - { - name: 'calculate_stats', - description: 'Calculate statistics on numeric data', - inputSchema: { - data: z.array(z.number()), - metrics: z.array(z.enum(['mean', 'median', 'sum', 'min', 'max', 'std'])) - } - }, - async ({ data, metrics }) => { - const stats: Record = {}; - - if (metrics.includes('sum')) { - stats.sum = data.reduce((a, b) => a + b, 0); - } - if (metrics.includes('mean')) { - stats.mean = stats.sum / data.length; - } - if (metrics.includes('min')) { - stats.min = Math.min(...data); - } - if (metrics.includes('max')) { - stats.max = Math.max(...data); - } - if (metrics.includes('median')) { - const sorted = [...data].sort((a, b) => a - b); - const mid = Math.floor(sorted.length / 2); - stats.median = sorted.length % 2 === 0 - ? (sorted[mid - 1] + sorted[mid]) / 2 - : sorted[mid]; - } - - return stats; - } - ) -}; -``` - -## Real-World Examples - -### Web Scraper Tool - -```typescript -import * as cheerio from 'cheerio'; - -const webScraperTool = tool( - { - name: 'scrape_webpage', - description: 'Extract text content from a webpage', - inputSchema: { - url: z.string().url(), - selector: z.string().optional() - } - }, - async ({ url, selector }) => { - const response = await fetch(url); - const html = await response.text(); - const $ = cheerio.load(html); - - if (selector) { - return $(selector).text(); - } - - return $('body').text(); - } -); -``` - -### Email Sender Tool - -```typescript -import nodemailer from 'nodemailer'; - -const emailTool = tool( - { - name: 'send_email', - description: 'Send an email', - inputSchema: { - to: z.string().email(), - subject: z.string(), - body: z.string(), - from: z.string().email().optional() - } - }, - async ({ to, subject, body, from = 'noreply@example.com' }) => { - const transporter = nodemailer.createTransport({ - host: process.env.SMTP_HOST, - port: Number(process.env.SMTP_PORT), - auth: { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASS - } - }); - - const info = await transporter.sendMail({ - from, - to, - subject, - text: body - }); - - return { - messageId: info.messageId, - accepted: info.accepted, - rejected: info.rejected - }; - } -); -``` - -## Testing Tools - -### Unit Testing - -```typescript -import { describe, it, expect } from '@jest/globals'; -import { tool } from '@agentage/sdk'; -import { z } from 'zod'; - -describe('calculator tool', () => { - const calculator = tool( - { - name: 'calculator', - description: 'Calculate', - inputSchema: { - operation: z.enum(['add', 'subtract']), - a: z.number(), - b: z.number() - } - }, - async ({ operation, a, b }) => { - if (operation === 'add') return a + b; - return a - b; - } - ); - - it('should add numbers', async () => { - const result = await calculator.execute({ - operation: 'add', - a: 5, - b: 3 - }); - expect(result).toBe(8); - }); - - it('should subtract numbers', async () => { - const result = await calculator.execute({ - operation: 'subtract', - a: 10, - b: 4 - }); - expect(result).toBe(6); - }); -}); -``` - -### Mocking External Dependencies - -```typescript -import { vi } from 'vitest'; - -describe('api tool', () => { - it('should call API', async () => { - // Mock fetch - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: async () => ({ data: 'test' }) - }); - - const apiTool = tool( - { - name: 'api', - description: 'Call API', - inputSchema: { url: z.string() } - }, - async ({ url }) => { - const res = await fetch(url); - return res.json(); - } - ); - - const result = await apiTool.execute({ - url: 'https://api.example.com' - }); - - expect(result).toEqual({ data: 'test' }); - expect(fetch).toHaveBeenCalledWith('https://api.example.com'); - }); -}); -``` - ---- - -## Next Steps - -- [Advanced Usage](./advanced-usage.md) - Complex patterns -- [API Reference](./api-reference.md) - Complete API docs -- [Examples](../examples/) - Working code examples - ---- - -**Ready to build tools?** Start with the [Getting Started Guide](./getting-started.md)! diff --git a/eslint.config.js b/eslint.config.mjs similarity index 85% rename from eslint.config.js rename to eslint.config.mjs index fba872a..a8b194d 100644 --- a/eslint.config.js +++ b/eslint.config.mjs @@ -7,7 +7,7 @@ export default [ languageOptions: { parser: tsParser, parserOptions: { - ecmaVersion: 2022, + ecmaVersion: 2024, sourceType: 'module', }, }, @@ -16,11 +16,8 @@ export default [ }, rules: { '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/explicit-function-return-type': 'warn', - '@typescript-eslint/no-unused-vars': [ - 'error', - { argsIgnorePattern: '^_' }, - ], + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/consistent-type-imports': 'error', '@typescript-eslint/naming-convention': [ 'error', { @@ -55,6 +52,7 @@ export default [ 'node_modules/', 'coverage/', '*.config.js', + '*.config.mjs', '*.config.ts', ], }, diff --git a/examples/agent-sdk-basic-example/.env.example b/examples/agent-sdk-basic-example/.env.example deleted file mode 100644 index 6a259ff..0000000 --- a/examples/agent-sdk-basic-example/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -# Copy this file to .env and add your OpenAI API key -# The key - could be generated: https://platform.openai.com/api-keys -OPENAI_API_KEY=your-api-key-here diff --git a/examples/agent-sdk-basic-example/.gitignore b/examples/agent-sdk-basic-example/.gitignore deleted file mode 100644 index 2e8157a..0000000 --- a/examples/agent-sdk-basic-example/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -.env -*.log diff --git a/examples/agent-sdk-basic-example/README.md b/examples/agent-sdk-basic-example/README.md deleted file mode 100644 index ffed9e0..0000000 --- a/examples/agent-sdk-basic-example/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# ChatGPT Basic Example - -Super simple TypeScript example showing how to use AgentKit SDK with OpenAI's ChatGPT. - -## Setup - -1. Install dependencies: -```bash -npm install -``` - -2. Create `.env` file: -```bash -cp .env.example .env -``` - -3. Add your OpenAI API key to `.env`: -``` -OPENAI_API_KEY=sk-... -``` - -## Run - -```bash -npm start -``` - -Or run in watch mode: -```bash -npm run dev -``` - -## What it does - -- Creates an agent using AgentKit SDK builder pattern -- Sends a message using the SDK's `send()` method -- Displays the response from GPT-4 -- Shows usage metadata -- Fully typed with TypeScript - -## Code - -```typescript -import { agent } from '@agentage/sdk'; - -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .config([{ key: 'OPENAI_API_KEY', value: process.env.OPENAI_API_KEY! }]) - .instructions('You are a helpful assistant'); - -const response = await assistant.send('Hello!'); -console.log(response.content); -``` - -## Next Steps - -Check out more advanced examples: -- `chatgpt-with-tools` - Using function calling -- `chatgpt-streaming` - Streaming responses diff --git a/examples/agent-sdk-basic-example/index.ts b/examples/agent-sdk-basic-example/index.ts deleted file mode 100644 index 056b306..0000000 --- a/examples/agent-sdk-basic-example/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { agent } from '@agentage/sdk'; -import dotenv from 'dotenv'; - -dotenv.config(); - -async function main(): Promise { - console.log('๐Ÿค– Agent SDK Example\n'); - - // Create agent using SDK - const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .config([{ key: 'OPENAI_API_KEY', value: process.env.OPENAI_API_KEY! }]) - .instructions('You are a helpful assistant'); - - console.log('๐Ÿ’ฌ Sending message to Agent...\n'); - - // Use the SDK send method (now implemented!) - const response = await assistant.send('Hello! What can you help me with?'); - - console.log('โœ… Response from Agent:\n'); - console.log(response.content); - console.log('\n๐Ÿ“Š Metadata:', response.metadata); -} - -main().catch(console.error); diff --git a/examples/agent-sdk-basic-example/package-lock.json b/examples/agent-sdk-basic-example/package-lock.json deleted file mode 100644 index 2d4a2f7..0000000 --- a/examples/agent-sdk-basic-example/package-lock.json +++ /dev/null @@ -1,660 +0,0 @@ -{ - "name": "agent-sdk-basic-example", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "agent-sdk-basic-example", - "version": "1.0.0", - "dependencies": { - "@agentage/core": "file:../../packages/core", - "@agentage/sdk": "file:../../packages/sdk", - "dotenv": "^16.4.5" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "tsx": "^4.6.0", - "typescript": "^5.3.0" - } - }, - "../../packages/core": { - "name": "@agentage/core", - "version": "0.1.0", - "license": "MIT", - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^8.46.3", - "@typescript-eslint/parser": "^8.46.3", - "eslint": "^9.39.1", - "jest": "^30.2.0", - "ts-jest": "^29.4.5", - "typescript": "^5.9.3" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - } - }, - "../../packages/sdk": { - "name": "@agentage/sdk", - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "@agentage/core": "^0.1.0", - "openai": "^6.8.1", - "zod": "3.25.76", - "zod-to-json-schema": "3.24.6" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^8.46.3", - "@typescript-eslint/parser": "^8.46.3", - "eslint": "^9.39.1", - "jest": "^30.2.0", - "ts-jest": "^29.4.5", - "tsx": "^4.20.6", - "typescript": "^5.9.3" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - } - }, - "node_modules/@agentage/core": { - "resolved": "../../packages/core", - "link": true - }, - "node_modules/@agentage/sdk": { - "resolved": "../../packages/sdk", - "link": true - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@types/node": { - "version": "20.19.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", - "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/examples/agent-sdk-basic-example/package.json b/examples/agent-sdk-basic-example/package.json deleted file mode 100644 index bda16fd..0000000 --- a/examples/agent-sdk-basic-example/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "agent-sdk-basic-example", - "version": "1.0.0", - "type": "module", - "private": true, - "description": "Basic example using AgentKit SDK", - "scripts": { - "start": "tsx index.ts", - "dev": "tsx watch index.ts" - }, - "dependencies": { - "@agentage/core": "file:../../packages/core", - "@agentage/sdk": "file:../../packages/sdk", - "dotenv": "^16.4.5" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "tsx": "^4.6.0", - "typescript": "^5.3.0" - } -} diff --git a/examples/agent-sdk-basic-example/tsconfig.json b/examples/agent-sdk-basic-example/tsconfig.json deleted file mode 100644 index 6347887..0000000 --- a/examples/agent-sdk-basic-example/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ES2022"], - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "allowImportingTsExtensions": true, - "noEmit": true - }, - "include": ["*.ts"], - "exclude": ["node_modules"] -} diff --git a/examples/agent-sdk-basic-tool-example/.env.example b/examples/agent-sdk-basic-tool-example/.env.example deleted file mode 100644 index fd15139..0000000 --- a/examples/agent-sdk-basic-tool-example/.env.example +++ /dev/null @@ -1 +0,0 @@ -OPENAI_API_KEY=sk-your-api-key-here diff --git a/examples/agent-sdk-basic-tool-example/.gitignore b/examples/agent-sdk-basic-tool-example/.gitignore deleted file mode 100644 index aa0926a..0000000 --- a/examples/agent-sdk-basic-tool-example/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -dist/ -.env -*.log diff --git a/examples/agent-sdk-basic-tool-example/README.md b/examples/agent-sdk-basic-tool-example/README.md deleted file mode 100644 index 58973c8..0000000 --- a/examples/agent-sdk-basic-tool-example/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Agent SDK Basic Tool Example - -Example showing how to define and use tools with AgentKit SDK. - -## Setup - -1. Install dependencies: -```bash -npm install -``` - -2. Create `.env` file: -```bash -cp .env.example .env -``` - -3. Add your OpenAI API key to `.env`: -``` -OPENAI_API_KEY=sk-... -``` - -## Run - -```bash -npm start -``` - -Or run in watch mode: -```bash -npm run dev -``` - -## What it does - -- Creates a calculator tool using the `tool()` factory -- Defines tool schema with parameters and types -- Implements the tool's execute function -- Creates an agent with the tool attached -- Shows tool definition structure - -## Code - -```typescript -import { agent, tool } from '@agentage/sdk'; - -// Define a tool -const calculatorTool = tool({ - name: 'calculator', - description: 'Performs basic arithmetic operations', - schema: { - type: 'object', - properties: { - operation: { type: 'string', enum: ['add', 'subtract', 'multiply', 'divide'] }, - a: { type: 'number' }, - b: { type: 'number' }, - }, - required: ['operation', 'a', 'b'], - }, - execute: async (params) => { - const result = /* calculate */; - return [{ role: 'tool', content: `Result: ${result}`, toolCallId: 'calc_1' }]; - }, -}); - -// Create agent with tool -const assistant = agent('math-assistant') - .model('gpt-4', { temperature: 0.7 }) - .config([{ key: 'OPENAI_API_KEY', value: process.env.OPENAI_API_KEY! }]) - .instructions('You are a helpful math assistant.') - .tools([calculatorTool]); - -const response = await assistant.send('What is 15 plus 27?'); -``` - -## Features - -โœ… **Tool calling is fully implemented!** The agent will: -- Receive your message -- Decide if it needs to use a tool -- Call the calculator tool with appropriate parameters -- Execute the tool function -- Return the final response with the calculation result - -## Tool Execution Flow - -1. User sends message: "What is 15 plus 27?" -2. Agent analyzes and decides to use the calculator tool -3. Agent calls: `calculator({ operation: 'add', a: 15, b: 27 })` -4. Tool executes and returns: `[{ role: 'tool', content: 'Result: 42', toolCallId: '...' }]` -5. Agent receives tool result and formulates final response -6. User receives: "The sum of 15 and 27 is 42." diff --git a/examples/agent-sdk-basic-tool-example/index.ts b/examples/agent-sdk-basic-tool-example/index.ts deleted file mode 100644 index 30b47ab..0000000 --- a/examples/agent-sdk-basic-tool-example/index.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { agent, tool } from '@agentage/sdk'; -import dotenv from 'dotenv'; -import { z } from 'zod'; - -dotenv.config(); - -async function main(): Promise { - console.log('๐Ÿค– Agent SDK Tool Example\n'); - - // Create a simple calculator tool - const calculatorTool = tool( - { - name: 'calculator', - title: 'Calculator Tool', - description: 'Performs basic arithmetic operations', - inputSchema: { - operation: z - .enum(['add', 'subtract', 'multiply', 'divide']) - .describe('The arithmetic operation to perform'), - a: z.number().describe('First number'), - b: z.number().describe('Second number'), - }, - }, - async ({ operation, a, b }) => { - let result: number; - switch (operation) { - case 'add': - result = a + b; - break; - case 'subtract': - result = a - b; - break; - case 'multiply': - result = a * b; - break; - case 'divide': - result = a / b; - break; - default: - throw new Error(`Unknown operation: ${operation}`); - } - - console.log(`๐Ÿ”ง Tool executed: ${a} ${operation} ${b} = ${result}`); - - return { - content: { - content: [{ type: 'text', text: String(result) }], - }, - }; - } - ); - - // Create agent with tool - const assistant = agent('math-assistant') - .model('gpt-4', { temperature: 0.7 }) - .config([{ key: 'OPENAI_API_KEY', value: process.env.OPENAI_API_KEY! }]) - .instructions( - 'You are a helpful math assistant. Use the calculator tool when asked to perform calculations.' - ) - .tools([calculatorTool]); - - console.log('๐Ÿ’ฌ Sending message to Agent...\n'); - - const response = await assistant.send('What is 15 plus 27?'); - - console.log('โœ… Response from Agent:\n'); - console.log(response.content); -} - -main().catch(console.error); diff --git a/examples/agent-sdk-basic-tool-example/package-lock.json b/examples/agent-sdk-basic-tool-example/package-lock.json deleted file mode 100644 index fcb681e..0000000 --- a/examples/agent-sdk-basic-tool-example/package-lock.json +++ /dev/null @@ -1,668 +0,0 @@ -{ - "name": "agent-sdk-basic-tool-example", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "agent-sdk-basic-tool-example", - "version": "1.0.0", - "dependencies": { - "@agentage/core": "file:../../packages/core", - "@agentage/sdk": "file:../../packages/sdk", - "dotenv": "^16.4.5", - "zod": "^4.1.12" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "tsx": "^4.6.0", - "typescript": "^5.3.0" - } - }, - "../../packages/core": { - "name": "@agentage/core", - "version": "0.0.1", - "license": "MIT", - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^8.46.2", - "@typescript-eslint/parser": "^8.46.2", - "eslint": "^9.39.0", - "jest": "^30.2.0", - "ts-jest": "^29.1.1", - "typescript": "^5.3.0" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - } - }, - "../../packages/sdk": { - "name": "@agentage/sdk", - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "@agentage/core": "*", - "openai": "^4.70.0" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^8.46.2", - "@typescript-eslint/parser": "^8.46.2", - "eslint": "^9.39.0", - "jest": "^30.2.0", - "ts-jest": "^29.1.1", - "tsx": "^4.6.0", - "typescript": "^5.3.0" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - } - }, - "node_modules/@agentage/core": { - "resolved": "../../packages/core", - "link": true - }, - "node_modules/@agentage/sdk": { - "resolved": "../../packages/sdk", - "link": true - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@types/node": { - "version": "20.19.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", - "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/examples/agent-sdk-basic-tool-example/package.json b/examples/agent-sdk-basic-tool-example/package.json deleted file mode 100644 index 50fb727..0000000 --- a/examples/agent-sdk-basic-tool-example/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "agent-sdk-basic-tool-example", - "version": "1.0.0", - "type": "module", - "private": true, - "description": "Basic example using AgentKit SDK with tools", - "scripts": { - "start": "tsx index.ts", - "dev": "tsx watch index.ts" - }, - "dependencies": { - "@agentage/core": "file:../../packages/core", - "@agentage/sdk": "file:../../packages/sdk", - "dotenv": "^16.4.5", - "zod": "^4.1.12" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "tsx": "^4.6.0", - "typescript": "^5.3.0" - } -} diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index b68902a..0000000 --- a/jest.config.js +++ /dev/null @@ -1,31 +0,0 @@ -export default { - preset: 'ts-jest/presets/default-esm', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - testMatch: ['**/packages/**/src/**/*.test.ts'], - collectCoverageFrom: [ - 'packages/**/src/**/*.ts', - '!packages/**/src/**/*.test.ts', - '!packages/**/src/**/*.d.ts', - ], - coverageDirectory: 'coverage', - coverageThreshold: { - global: { - branches: 70, - functions: 70, - lines: 70, - statements: 70, - }, - }, -}; diff --git a/package-lock.json b/package-lock.json index ffcb1e0..5c11793 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,18 +12,19 @@ "packages/*" ], "devDependencies": { - "@types/jest": "30.0.0", - "@types/node": "25.5.0", - "@typescript-eslint/eslint-plugin": "8.57.0", - "@typescript-eslint/parser": "8.57.0", - "eslint": "9.39.4", - "jest": "30.3.0", - "ts-jest": "29.4.6", - "tsx": "4.21.0", - "typescript": "5.9.3" - }, - "engines": { - "node": ">=20.0.0", + "@types/node": "latest", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", + "@vitest/coverage-v8": "latest", + "eslint": "latest", + "eslint-config-prettier": "latest", + "eslint-plugin-prettier": "latest", + "prettier": "latest", + "typescript": "latest", + "vitest": "latest" + }, + "engines": { + "node": ">=22.0.0", "npm": ">=10.0.0" } }, @@ -31,653 +32,356 @@ "resolved": "packages/core", "link": true }, - "node_modules/@agentage/model-openai": { - "resolved": "packages/model-openai", + "node_modules/@agentage/platform": { + "resolved": "packages/platform", "link": true }, - "node_modules/@agentage/sdk": { - "resolved": "packages/sdk", - "link": true - }, - "node_modules/@babel/code-frame": { + "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.29.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", "bin": { - "semver": "bin/semver.js" + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@oxc-project/types": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz", + "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emnapi/core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", - "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", - "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==", "cpu": [ "x64" ], @@ -688,30 +392,13 @@ "darwin" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==", "cpu": [ "x64" ], @@ -722,13 +409,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz", + "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==", "cpu": [ "arm" ], @@ -739,13 +426,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==", "cpu": [ "arm64" ], @@ -756,15 +443,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", @@ -773,15 +460,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==", "cpu": [ - "loong64" + "ppc64" ], "dev": true, "license": "MIT", @@ -790,15 +477,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==", "cpu": [ - "mips64el" + "s390x" ], "dev": true, "license": "MIT", @@ -807,15 +494,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", @@ -824,15 +511,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==", "cpu": [ - "riscv64" + "x64" ], "dev": true, "license": "MIT", @@ -841,47 +528,47 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==", "cpu": [ - "s390x" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "openharmony" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz", + "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==", "cpu": [ - "x64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==", "cpu": [ "arm64" ], @@ -889,16 +576,16 @@ "license": "MIT", "optional": true, "os": [ - "netbsd" + "win32" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==", "cpu": [ "x64" ], @@ -906,5091 +593,1591 @@ "license": "MIT", "optional": true, "os": [ - "netbsd" + "win32" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz", + "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "undici-types": "~7.18.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0" + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://eslint.org/donate" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=18.18.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "node_modules/@vitest/coverage-v8": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.0.tgz", + "integrity": "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.0", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=18.18.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.0", + "vitest": "4.1.0" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@vitest/expect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "url": "https://opencollective.com/vitest" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "node_modules/@vitest/runner": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@vitest/utils": "4.1.0", + "pathe": "^2.0.3" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/@vitest/snapshot": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@vitest/spy": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@vitest/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jest/console": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", - "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12" } }, - "node_modules/@jest/core": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", - "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.3.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.3.0", - "jest-config": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-resolve-dependencies": "30.3.0", - "jest-runner": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "jest-watcher": "30.3.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" } }, - "node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/environment": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", - "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "expect": "30.3.0", - "jest-snapshot": "30.3.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18" } }, - "node_modules/@jest/expect-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", - "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 8" } }, - "node_modules/@jest/fake-timers": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", - "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "@sinonjs/fake-timers": "^15.0.0", - "@types/node": "*", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "ms": "^2.1.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } + "license": "MIT" }, - "node_modules/@jest/globals": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", - "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/types": "30.3.0", - "jest-mock": "30.3.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/reporters": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", - "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "node_modules/eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", "dev": true, "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "jiti": "*" }, "peerDependenciesMeta": { - "node-notifier": { + "jiti": { "optional": true } } }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", - "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/test-result": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", - "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/types": "30.3.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", - "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "slash": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/transform": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", - "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 4" } }, - "node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=4.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@types/estree": "^1.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", - "optional": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" + "node": ">=12.0.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } + "license": "Apache-2.0" }, - "node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } + "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } + "license": "MIT" }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/istanbul-lib-report": "*" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" + "engines": { + "node": ">= 4" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", - "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=0.8.19" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", - "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/type-utils": "8.57.0", - "@typescript-eslint/utils": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "is-extglob": "^2.1.1" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", - "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", - "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.0", - "@typescript-eslint/types": "^8.57.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", - "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", - "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", - "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0", - "@typescript-eslint/utils": "8.57.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", - "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", - "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.57.0", - "@typescript-eslint/tsconfig-utils": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", - "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", - "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/babel-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", - "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.3.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", - "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", - "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", - "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001753", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", - "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.245", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", - "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "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.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", - "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.3.0", - "@jest/types": "30.3.0", - "import-local": "^3.2.0", - "jest-cli": "30.3.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", - "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.3.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", - "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "p-limit": "^3.1.0", - "pretty-format": "30.3.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-cli": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", - "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", - "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.3.0", - "@jest/types": "30.3.0", - "babel-jest": "30.3.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-circus": "30.3.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-runner": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "parse-json": "^5.2.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", - "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.3.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", - "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "jest-util": "30.3.0", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", - "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", - "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "picomatch": "^4.0.3", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-haste-map/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", - "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", - "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-mock": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", - "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-util": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", - "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", - "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", - "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/environment": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-leak-detector": "30.3.0", - "jest-message-util": "30.3.0", - "jest-resolve": "30.3.0", - "jest-runtime": "30.3.0", - "jest-util": "30.3.0", - "jest-watcher": "30.3.0", - "jest-worker": "30.3.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", - "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/globals": "30.3.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", - "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "pretty-format": "30.3.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", - "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", - "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.3.0", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", - "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.3.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openai": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.29.0.tgz", - "integrity": "sha512-YxoArl2BItucdO89/sN6edksV0x47WUTgkgVfCgX7EuEMhbirENsgYe5oO4LTjBL9PtdKtk2WqND1gSLcTd2yw==", - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { + "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "json-buffer": "3.0.1" } }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "ansi-regex": "^5.0.1" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/synckit" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.0.0" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" } }, - "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" + "semver": "^7.5.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" + "node": ">=10" }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, "engines": { - "node": ">=16" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "0BSD", - "optional": true + "license": "MIT" }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, "bin": { - "tsx": "dist/cli.mjs" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { "node": ">=10" }, @@ -5998,89 +2185,66 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">=8" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", @@ -6089,305 +2253,503 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", "bin": { - "update-browserslist-db": "cli.js" + "prettier": "bin/prettier.cjs" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10.12.0" + "node": ">=6" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/rolldown": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz", + "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "makeerror": "1.0.12" + "@oxc-project/types": "=0.120.0", + "@rolldown/pluginutils": "1.0.0-rc.10" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-x64": "1.0.0-rc.10", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, "bin": { - "node-which": "bin/node-which" + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8" + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://opencollective.com/synckit" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "ISC" + "license": "0BSD", + "optional": true }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.8.0" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=10" + "node": ">=14.17" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, - "license": "ISC" + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/vite": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz", + "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.10", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", + "node_modules/vitest": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, "engines": { - "node": ">=12" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" }, "engines": { "node": ">=8" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/yocto-queue": { @@ -6403,120 +2765,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "packages/cli": { - "name": "@agentage/cli", - "version": "0.1.18", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@agentage/core": "^0.1.0", - "@agentage/sdk": "^0.1.0", - "chalk": "^5.6.2", - "commander": "^14.0.2", - "gray-matter": "^4.0.3", - "inquirer": "^13.0.1", - "js-yaml": "^4.1.0", - "node-machine-id": "1.1.12", - "open": "^10.1.0", - "yaml": "^2.8.1", - "zod": "3.25.76" - }, - "bin": { - "agent": "dist/cli.js", - "agentkit": "dist/cli.js" - }, - "devDependencies": { - "@types/inquirer": "^9.0.9", - "@types/jest": "^30.0.0", - "@types/js-yaml": "^4.0.9", - "@types/node": "^22.8.6", - "@typescript-eslint/eslint-plugin": "^8.46.3", - "@typescript-eslint/parser": "^8.46.3", - "eslint": "^9.39.1", - "jest": "^30.2.0", - "ts-jest": "^29.4.5", - "tsx": "^4.20.6", - "typescript": "^5.9.3" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - } - }, "packages/core": { "name": "@agentage/core", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "typescript": "^5.9.3" - }, "engines": { - "node": ">=20.0.0", + "node": ">=22.0.0", "npm": ">=10.0.0" } }, - "packages/model-openai": { - "name": "@agentage/model-openai", - "version": "0.1.0", + "packages/platform": { + "name": "@agentage/platform", + "version": "0.2.0", "license": "MIT", - "dependencies": { - "@agentage/core": "^0.1.0", - "openai": "^6.29.0" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "typescript": "^5.9.3" - }, + "devDependencies": {}, "engines": { - "node": ">=20.0.0", + "node": ">=22.0.0", "npm": ">=10.0.0" - } - }, - "packages/sdk": { - "name": "@agentage/sdk", - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "@agentage/core": "^0.1.0", - "openai": "^6.29.0", - "zod": "^4.3.6" }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "tsx": "^4.21.0", - "typescript": "^5.9.3" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" + "peerDependencies": { + "@agentage/core": "^0.2.0" } } } diff --git a/package.json b/package.json index c03ae42..2fd0837 100644 --- a/package.json +++ b/package.json @@ -8,19 +8,21 @@ "packages/*" ], "engines": { - "node": ">=20.0.0", + "node": ">=22.0.0", "npm": ">=10.0.0" }, "scripts": { - "build": "npm run build -w @agentage/core && npm run build -w @agentage/sdk && npm run build -w @agentage/model-openai", - "type-check": "npm run type-check --workspaces", - "lint": "npm run lint --workspaces", - "lint:fix": "npm run lint:fix --workspaces", - "test": "npm run test --workspaces", - "test:watch": "npm run test:watch --workspaces", - "test:coverage": "npm run test:coverage --workspaces", - "clean": "npm run clean --workspaces", - "verify": "npm run build && npm run type-check && npm run lint && npm run test" + "build": "npm run build -w @agentage/core && npm run build -w @agentage/platform", + "type-check": "tsc -b", + "lint": "npm run lint --workspaces --if-present", + "lint:fix": "npm run lint:fix --workspaces --if-present", + "format": "npm run format --workspaces --if-present", + "format:check": "npm run format:check --workspaces --if-present", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "clean": "npm run clean --workspaces --if-present", + "verify": "npm run type-check && npm run lint && npm run format:check && npm run test && npm run build" }, "keywords": [ "agent", @@ -43,14 +45,15 @@ }, "homepage": "https://github.com/agentage/agentkit#readme", "devDependencies": { - "@types/jest": "30.0.0", - "@types/node": "25.5.0", - "@typescript-eslint/eslint-plugin": "8.57.0", - "@typescript-eslint/parser": "8.57.0", - "eslint": "9.39.4", - "jest": "30.3.0", - "ts-jest": "29.4.6", - "tsx": "4.21.0", - "typescript": "5.9.3" + "@types/node": "latest", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", + "@vitest/coverage-v8": "latest", + "eslint": "latest", + "eslint-config-prettier": "latest", + "eslint-plugin-prettier": "latest", + "prettier": "latest", + "typescript": "latest", + "vitest": "latest" } } diff --git a/packages/.gitkeep b/packages/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/README.md b/packages/README.md deleted file mode 100644 index ae2d6d8..0000000 --- a/packages/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# AgentKit Packages - -## Packages - -- **[@agentage/sdk](./sdk)** - Core SDK with interface definitions and types -- **[@agentage/model-openai](./model-openai)** - OpenAI model adapter diff --git a/packages/core/.npmignore b/packages/core/.npmignore deleted file mode 100644 index c435169..0000000 --- a/packages/core/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -# Source files -src/ -*.test.ts - -# Config files -tsconfig.json -jest.config.js -eslint.config.js - -# Coverage -coverage/ -*.tsbuildinfo - -# IDE -.vscode/ -.idea/ - -# OS -.DS_Store -Thumbs.db diff --git a/packages/core/LICENSE b/packages/core/LICENSE deleted file mode 100644 index c28397b..0000000 --- a/packages/core/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Agentage - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/core/README.md b/packages/core/README.md deleted file mode 100644 index d4d6435..0000000 --- a/packages/core/README.md +++ /dev/null @@ -1,109 +0,0 @@ -# @agentage/core - -Core types and interfaces for AgentKit - the simple SDK for building AI agents in Node.js. - -## Installation - -```bash -npm install @agentage/core -``` - -## Usage - -```typescript -import type { - Agent, - AgentConfig, - AgentResponse, - Tool, - ModelConfig, - ModelProvider, - Model, - SupportedModel, - Message, - Result, - ConfigEntry, - RuntimeConfig, - EnvironmentConfig -} from '@agentage/core'; - -// Example: Result type usage -const divide = (a: number, b: number): Result => { - if (b === 0) { - return { ok: false, error: 'Division by zero' }; - } - return { ok: true, data: a / b }; -}; - -// Example: ModelProvider implementation -const myProvider: ModelProvider = { - name: 'my-provider', - getSupportedModels: () => [ - { - name: 'my-model', - capabilities: { streaming: true, functionCalling: true } - } - ], - getModel: (name, config) => ({ - name, - send: async (request) => ({ content: 'response' }) - }), - supportsModel: (name) => name === 'my-model' -}; -``` - -## Included Types - -### Agent Types -- `Agent` - Agent interface with builder pattern -- `AgentConfig` - Agent configuration object -- `AgentResponse` - Agent execution response - -### Message Types -- `Message` - Union of all message types -- `SystemMessage` - System instructions -- `UserMessage` - User input -- `AssistantMessage` - Assistant response -- `ToolMessage` - Tool execution result - -### Tool Types -- `Tool` - Tool definition with type inference -- `ToolSchema` - Schema validator (Zod-compatible) -- `InferSchemaType` - Automatic type inference from schema - -### Model Types -- `ModelConfig` - Model configuration options -- `ModelDefinition` - Model with configuration -- `ModelProvider` - Model provider adapter interface -- `Model` - Model interface for send/stream operations -- `SupportedModel` - Model information with capabilities -- `ModelRequest` - Request to model provider -- `ModelResponse` - Response from model provider - -### Config Types -- `ConfigEntry` - Configuration entry with key, value, and optional scope -- `RuntimeConfig` - Runtime configuration with entries -- `EnvironmentConfig` - Environment and API configuration - -### Result Types -- `Result` - Functional error handling union type -- `Success` - Success result with `ok: true` and `data: T` -- `Failure` - Failure result with `ok: false` and `error: E` - -### Utility Types -- `InferSchemaType` - Automatic type inference from schema - -## Philosophy - -- **Type-safe**: Zero `any` types, all explicit -- **Functional**: Composable, immutable types -- **Simple**: Easy to understand and extend -- **Powerful**: Type inference from schemas - -## Related Packages - -- `@agentage/sdk` - Main SDK implementation - -## License - -MIT \ No newline at end of file diff --git a/packages/core/eslint.config.js b/packages/core/eslint.config.js deleted file mode 100644 index 30c11e9..0000000 --- a/packages/core/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import tseslint from '@typescript-eslint/eslint-plugin'; -import tsparser from '@typescript-eslint/parser'; - -export default [ - { - files: ['**/*.ts'], - languageOptions: { - parser: tsparser, - parserOptions: { - project: './tsconfig.json', - }, - }, - plugins: { - '@typescript-eslint': tseslint, - }, - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { argsIgnorePattern: '^_' }, - ], - }, - }, - { - ignores: ['dist/', 'coverage/', '*.js', '!eslint.config.js'], - }, -]; diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js deleted file mode 100644 index 54fd30e..0000000 --- a/packages/core/jest.config.js +++ /dev/null @@ -1,19 +0,0 @@ -export default { - preset: 'ts-jest', - testEnvironment: 'node', - roots: ['/src'], - testMatch: ['**/*.test.ts'], - collectCoverageFrom: ['src/**/*.ts', '!src/**/*.test.ts'], - coverageThreshold: { - global: { - branches: 70, - functions: 70, - lines: 70, - statements: 70, - }, - }, - extensionsToTreatAsEsm: ['.ts'], - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, -}; diff --git a/packages/core/package.json b/packages/core/package.json index 88accbc..e468f64 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,20 +1,33 @@ { "name": "@agentage/core", - "version": "0.1.0", - "description": "Core types and interfaces for AgentKit - the simple SDK for building AI agents in Node.js", + "version": "0.2.0", + "description": "Agent interface and run model for the Agentage platform", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "files": ["dist"], + "engines": { + "node": ">=22.0.0", + "npm": ">=10.0.0" + }, "scripts": { "build": "tsc", "type-check": "tsc --noEmit", - "lint": "eslint src --ext .ts", - "lint:fix": "eslint src --ext .ts --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage", - "clean": "rm -rf dist *.tsbuildinfo coverage", - "verify": "npm run type-check && npm run lint && npm run build && npm run test", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "format": "prettier --write \"src/**/*.ts\" \"!src/**/*.d.ts\"", + "format:check": "prettier --check \"src/**/*.ts\" \"!src/**/*.d.ts\"", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "clean": "rm -rf dist *.tsbuildinfo coverage src/**/*.d.ts", + "verify": "npm run type-check && npm run lint && npm run format:check && npm run test && npm run build", "prepublishOnly": "npm run verify" }, "keywords": [ @@ -33,19 +46,5 @@ "bugs": { "url": "https://github.com/agentage/agentkit/issues" }, - "homepage": "https://github.com/agentage/agentkit/tree/master/packages/core#readme", - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "typescript": "^5.9.3" - } + "homepage": "https://github.com/agentage/agentkit/tree/master/packages/core#readme" } diff --git a/packages/core/src/constants.test.ts b/packages/core/src/constants.test.ts new file mode 100644 index 0000000..b5e0d9e --- /dev/null +++ b/packages/core/src/constants.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; +import { OUTPUT_FORMATS, STATE_TRANSITIONS, TERMINAL_STATES } from './constants.js'; + +describe('TERMINAL_STATES', () => { + it('contains exactly completed, failed, canceled', () => { + expect(TERMINAL_STATES).toEqual(['completed', 'failed', 'canceled']); + }); +}); + +describe('STATE_TRANSITIONS', () => { + it('has entries for all 6 states', () => { + expect(Object.keys(STATE_TRANSITIONS)).toHaveLength(6); + }); + + it('terminal states have empty arrays', () => { + expect(STATE_TRANSITIONS.completed).toEqual([]); + expect(STATE_TRANSITIONS.failed).toEqual([]); + expect(STATE_TRANSITIONS.canceled).toEqual([]); + }); +}); + +describe('OUTPUT_FORMATS', () => { + it('has expected keys', () => { + expect(OUTPUT_FORMATS.text).toBe('text'); + expect(OUTPUT_FORMATS.markdown).toBe('markdown'); + expect(OUTPUT_FORMATS.json).toBe('json'); + expect(OUTPUT_FORMATS.binary).toBe('binary'); + expect(OUTPUT_FORMATS.llmDelta).toBe('llm.delta'); + expect(OUTPUT_FORMATS.llmMessage).toBe('llm.message'); + expect(OUTPUT_FORMATS.llmUsage).toBe('llm.usage'); + expect(OUTPUT_FORMATS.llmToolCall).toBe('llm.tool_call'); + expect(OUTPUT_FORMATS.llmToolResult).toBe('llm.tool_result'); + expect(OUTPUT_FORMATS.llmThinking).toBe('llm.thinking'); + expect(OUTPUT_FORMATS.progress).toBe('progress'); + }); +}); diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index 7f42931..071b4d1 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -1,3 +1,29 @@ -export const SDK_VERSION = '0.1.0'; -export const DEFAULT_TIMEOUT = 30000; -export const DEFAULT_BASE_URL = 'https://api.agentkit.io'; +import type { RunState } from './types.js'; + +/** Terminal states โ€” no further transitions */ +export const TERMINAL_STATES: readonly RunState[] = ['completed', 'failed', 'canceled'] as const; + +/** Valid state transitions */ +export const STATE_TRANSITIONS: Readonly> = { + submitted: ['working', 'canceled'], + working: ['completed', 'failed', 'canceled', 'input_required'], + input_required: ['working', 'canceled'], + completed: [], + failed: [], + canceled: [], +} as const; + +/** Output format string constants */ +export const OUTPUT_FORMATS = { + text: 'text', + markdown: 'markdown', + json: 'json', + binary: 'binary', + llmDelta: 'llm.delta', + llmMessage: 'llm.message', + llmUsage: 'llm.usage', + llmToolCall: 'llm.tool_call', + llmToolResult: 'llm.tool_result', + llmThinking: 'llm.thinking', + progress: 'progress', +} as const; diff --git a/packages/core/src/create-agent.test.ts b/packages/core/src/create-agent.test.ts new file mode 100644 index 0000000..9173067 --- /dev/null +++ b/packages/core/src/create-agent.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from 'vitest'; +import { createAgent } from './create-agent.js'; +import type { RunEvent } from './types.js'; + +describe('createAgent', () => { + const makeAgent = () => + createAgent({ + name: 'test-agent', + description: 'A test agent', + version: '1.0.0', + tags: ['test'], + path: '/tmp/test-agent', + async *run(input) { + yield { + type: 'output', + data: { type: 'output', content: `Hello: ${input.task}`, format: 'text' }, + timestamp: Date.now(), + }; + yield { + type: 'result', + data: { type: 'result', success: true, output: 'done' }, + timestamp: Date.now(), + }; + }, + }); + + it('creates agent with correct manifest fields', () => { + const agent = makeAgent(); + expect(agent.manifest.name).toBe('test-agent'); + expect(agent.manifest.description).toBe('A test agent'); + expect(agent.manifest.version).toBe('1.0.0'); + expect(agent.manifest.tags).toEqual(['test']); + expect(agent.manifest.path).toBe('/tmp/test-agent'); + }); + + it('run() returns AgentProcess with runId', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + expect(process.runId).toBeDefined(); + expect(typeof process.runId).toBe('string'); + expect(process.runId.length).toBeGreaterThan(0); + }); + + it('run() returns AgentProcess with events async iterable', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + expect(process.events).toBeDefined(); + expect(Symbol.asyncIterator in Object(process.events)).toBe(true); + }); + + it('events have correct shape', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + const events: RunEvent[] = []; + for await (const event of process.events) { + events.push(event); + } + for (const event of events) { + expect(event).toHaveProperty('type'); + expect(event).toHaveProperty('data'); + expect(event).toHaveProperty('timestamp'); + } + }); + + it('yields output events with content and format', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'world' }); + const events: RunEvent[] = []; + for await (const event of process.events) { + events.push(event); + } + const outputEvent = events.find((e) => e.type === 'output'); + expect(outputEvent).toBeDefined(); + expect(outputEvent!.data).toEqual({ + type: 'output', + content: 'Hello: world', + format: 'text', + }); + }); + + it('yields result event at end', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + const events: RunEvent[] = []; + for await (const event of process.events) { + events.push(event); + } + const lastEvent = events[events.length - 1]; + expect(lastEvent.type).toBe('result'); + expect(lastEvent.data).toEqual({ type: 'result', success: true, output: 'done' }); + }); + + it('cancel() is callable', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + expect(() => process.cancel()).not.toThrow(); + }); + + it('sendInput() is callable', async () => { + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + expect(() => process.sendInput('test')).not.toThrow(); + }); + + it('runId is unique per call', async () => { + const agent = makeAgent(); + const p1 = await agent.run({ task: 'a' }); + const p2 = await agent.run({ task: 'b' }); + expect(p1.runId).not.toBe(p2.runId); + }); + + it('timestamps are valid Unix ms', async () => { + const before = Date.now(); + const agent = makeAgent(); + const process = await agent.run({ task: 'hello' }); + const events: RunEvent[] = []; + for await (const event of process.events) { + events.push(event); + } + const after = Date.now(); + for (const event of events) { + expect(event.timestamp).toBeGreaterThanOrEqual(before); + expect(event.timestamp).toBeLessThanOrEqual(after); + } + }); +}); diff --git a/packages/core/src/create-agent.ts b/packages/core/src/create-agent.ts new file mode 100644 index 0000000..86b52bd --- /dev/null +++ b/packages/core/src/create-agent.ts @@ -0,0 +1,36 @@ +import type { Agent, AgentProcess, JsonSchema, RunEvent, RunInput } from './types.js'; + +interface CreateAgentConfig { + name: string; + description?: string; + version?: string; + tags?: string[]; + inputSchema?: JsonSchema; + path: string; + config?: Record; + run: (input: RunInput) => AsyncIterable; +} + +/** Convenience function that constructs an Agent object */ +export const createAgent = (agentConfig: CreateAgentConfig): Agent => ({ + manifest: { + name: agentConfig.name, + description: agentConfig.description, + version: agentConfig.version, + tags: agentConfig.tags, + inputSchema: agentConfig.inputSchema, + path: agentConfig.path, + config: agentConfig.config, + }, + async run(input: RunInput): Promise { + const runId = crypto.randomUUID(); + const events = agentConfig.run(input); + + return { + runId, + events, + cancel() {}, + sendInput() {}, + }; + }, +}); diff --git a/packages/core/src/index.test.ts b/packages/core/src/index.test.ts deleted file mode 100644 index 8133078..0000000 --- a/packages/core/src/index.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - DEFAULT_BASE_URL, - DEFAULT_TIMEOUT, - SDK_VERSION, - version, -} from './index'; - -describe('@agentage/core', () => { - describe('version', () => { - it('should export version string', () => { - expect(version).toBe('0.0.1'); - expect(typeof version).toBe('string'); - }); - }); - - describe('constants', () => { - it('should export SDK_VERSION', () => { - expect(SDK_VERSION).toBe('0.1.0'); - expect(typeof SDK_VERSION).toBe('string'); - }); - - it('should export DEFAULT_TIMEOUT', () => { - expect(DEFAULT_TIMEOUT).toBe(30000); - expect(typeof DEFAULT_TIMEOUT).toBe('number'); - }); - - it('should export DEFAULT_BASE_URL', () => { - expect(DEFAULT_BASE_URL).toBe('https://api.agentkit.io'); - expect(typeof DEFAULT_BASE_URL).toBe('string'); - }); - }); -}); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d68175a..f3ca685 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,10 +1,17 @@ -export * from './constants.js'; -export * from './types/agent.types.js'; -export * from './types/config.types.js'; -export * from './types/message.types.js'; -export * from './types/model.types.js'; -export * from './types/modelprovider.types.js'; -export * from './types/result.types.js'; -export * from './types/tool.types.js'; +export type { + JsonSchema, + AgentManifest, + AgentProcess, + Agent, + AgentFactory, + RunState, + RunInput, + Run, + RunEventType, + RunEventData, + RunEvent, +} from './types.js'; -export const version = '0.0.1'; +export { TERMINAL_STATES, STATE_TRANSITIONS, OUTPUT_FORMATS } from './constants.js'; +export { isTerminal, canTransition } from './state-machine.js'; +export { createAgent } from './create-agent.js'; diff --git a/packages/core/src/integration.test.ts b/packages/core/src/integration.test.ts new file mode 100644 index 0000000..b6d2b8f --- /dev/null +++ b/packages/core/src/integration.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from 'vitest'; +import { createAgent } from './create-agent.js'; +import type { RunEvent } from './types.js'; + +describe('createAgent end-to-end', () => { + it('creates agent, runs it, collects events', async () => { + const agent = createAgent({ + name: 'echo-agent', + description: 'Echoes input', + path: '/tmp/echo', + async *run(input) { + yield { + type: 'output', + data: { type: 'output', content: `Echo: ${input.task}`, format: 'text' }, + timestamp: Date.now(), + }; + yield { + type: 'result', + data: { type: 'result', success: true, output: 'done' }, + timestamp: Date.now(), + }; + }, + }); + + const process = await agent.run({ task: 'hello' }); + expect(typeof process.runId).toBe('string'); + + const events: RunEvent[] = []; + for await (const event of process.events) { + events.push(event); + } + + expect(events.length).toBeGreaterThanOrEqual(2); + + const outputEvents = events.filter((e) => e.type === 'output'); + expect(outputEvents.length).toBeGreaterThanOrEqual(1); + const outputData = outputEvents[0].data; + expect(outputData.type).toBe('output'); + if (outputData.type === 'output') { + expect(outputData.format).toBe('text'); + } + + const resultEvents = events.filter((e) => e.type === 'result'); + expect(resultEvents).toHaveLength(1); + const resultEvent = resultEvents[0]; + expect(resultEvent.data).toEqual({ type: 'result', success: true, output: 'done' }); + expect(resultEvent).toBe(events[events.length - 1]); + + for (const event of events) { + expect(event.timestamp).toBeGreaterThan(0); + expect(typeof event.timestamp).toBe('number'); + } + }); +}); diff --git a/packages/core/src/state-machine.test.ts b/packages/core/src/state-machine.test.ts new file mode 100644 index 0000000..add421c --- /dev/null +++ b/packages/core/src/state-machine.test.ts @@ -0,0 +1,102 @@ +import { describe, expect, it } from 'vitest'; +import { canTransition, isTerminal } from './state-machine.js'; +import { STATE_TRANSITIONS, TERMINAL_STATES } from './constants.js'; +import type { RunState } from './types.js'; + +describe('isTerminal', () => { + it('returns true for completed', () => { + expect(isTerminal('completed')).toBe(true); + }); + + it('returns true for failed', () => { + expect(isTerminal('failed')).toBe(true); + }); + + it('returns true for canceled', () => { + expect(isTerminal('canceled')).toBe(true); + }); + + it('returns false for submitted', () => { + expect(isTerminal('submitted')).toBe(false); + }); + + it('returns false for working', () => { + expect(isTerminal('working')).toBe(false); + }); + + it('returns false for input_required', () => { + expect(isTerminal('input_required')).toBe(false); + }); +}); + +describe('canTransition', () => { + it('submitted โ†’ working', () => { + expect(canTransition('submitted', 'working')).toBe(true); + }); + + it('submitted โ†’ canceled', () => { + expect(canTransition('submitted', 'canceled')).toBe(true); + }); + + it('submitted โ†’ completed is invalid', () => { + expect(canTransition('submitted', 'completed')).toBe(false); + }); + + it('working โ†’ completed', () => { + expect(canTransition('working', 'completed')).toBe(true); + }); + + it('working โ†’ failed', () => { + expect(canTransition('working', 'failed')).toBe(true); + }); + + it('working โ†’ canceled', () => { + expect(canTransition('working', 'canceled')).toBe(true); + }); + + it('working โ†’ input_required', () => { + expect(canTransition('working', 'input_required')).toBe(true); + }); + + it('input_required โ†’ working', () => { + expect(canTransition('input_required', 'working')).toBe(true); + }); + + it('input_required โ†’ canceled', () => { + expect(canTransition('input_required', 'canceled')).toBe(true); + }); + + it('completed โ†’ working is invalid', () => { + expect(canTransition('completed', 'working')).toBe(false); + }); + + it('failed โ†’ working is invalid', () => { + expect(canTransition('failed', 'working')).toBe(false); + }); + + it('canceled โ†’ working is invalid', () => { + expect(canTransition('canceled', 'working')).toBe(false); + }); + + it('all terminal states have empty transition arrays', () => { + for (const state of TERMINAL_STATES) { + expect(STATE_TRANSITIONS[state]).toEqual([]); + } + }); +}); + +describe('STATE_TRANSITIONS', () => { + it('has entries for all 6 states', () => { + const allStates: RunState[] = [ + 'submitted', + 'working', + 'input_required', + 'completed', + 'failed', + 'canceled', + ]; + for (const state of allStates) { + expect(STATE_TRANSITIONS).toHaveProperty(state); + } + }); +}); diff --git a/packages/core/src/state-machine.ts b/packages/core/src/state-machine.ts new file mode 100644 index 0000000..cbd8636 --- /dev/null +++ b/packages/core/src/state-machine.ts @@ -0,0 +1,9 @@ +import type { RunState } from './types.js'; +import { STATE_TRANSITIONS, TERMINAL_STATES } from './constants.js'; + +/** Check if a run state is terminal */ +export const isTerminal = (state: RunState): boolean => TERMINAL_STATES.includes(state); + +/** Check if a state transition is valid */ +export const canTransition = (from: RunState, to: RunState): boolean => + STATE_TRANSITIONS[from].includes(to); diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts new file mode 100644 index 0000000..f46d7de --- /dev/null +++ b/packages/core/src/types.ts @@ -0,0 +1,150 @@ +/** JSON Schema (Draft 7) */ +export type JsonSchema = Record; + +/** Metadata for discovery and display. */ +export interface AgentManifest { + /** Unique identifier (kebab-case) */ + name: string; + + /** Human-readable description */ + description?: string; + + /** Semver version */ + version?: string; + + /** Tags for filtering/search */ + tags?: string[]; + + /** JSON Schema for structured input this agent accepts (beyond plain text) */ + inputSchema?: JsonSchema; + + /** The source path this agent was loaded from */ + path: string; + + /** + * Adapter-specific configuration. + * Core passes through, doesn't interpret. + * Examples: { model, temperature } for LLM, { image } for Docker, { command } for process. + */ + config?: Record; +} + +/** A running agent process */ +export interface AgentProcess { + /** Unique run ID */ + runId: string; + + /** Async iterator of events โ€” the primary output channel */ + events: AsyncIterable; + + /** Cancel execution */ + cancel(): void; + + /** Provide input to a waiting agent (when state = input_required) */ + sendInput(input: string): void; +} + +/** The full agent โ€” metadata + ability to run. Constructed from a path by a factory. */ +export interface Agent { + /** Metadata for discovery and display */ + manifest: AgentManifest; + + /** + * Execute this agent. + * @param input - task, config overrides, context + * @returns a running process with event stream + */ + run(input: RunInput): Promise; +} + +/** + * Given a path, try to construct an Agent. + * Return null if this factory doesn't handle this path. + * + * This is the only thing you implement to add a new agent type. + */ +export type AgentFactory = (path: string) => Promise; + +/** + * Run states: + * + * submitted โ†’ working โ†’ completed + * โ†’ failed + * โ†’ canceled + * working โ†” input_required + */ +export type RunState = + | 'submitted' + | 'working' + | 'input_required' + | 'completed' + | 'failed' + | 'canceled'; + +/** Input to an agent run */ +export interface RunInput { + /** The task/prompt โ€” what the agent should do */ + task: string; + + /** Per-run config overrides (factory-specific) */ + config?: Record; + + /** Additional context (file paths, text, URLs โ€” agent decides how to use) */ + context?: string[]; +} + +/** Execution record */ +export interface Run { + /** Unique run ID */ + id: string; + + /** Agent name */ + agentName: string; + + /** The task/prompt */ + input: string; + + /** Current state */ + state: RunState; + + /** Error message (if state = failed) */ + error?: string; + + /** + * Factory-specific stats. + * Core doesn't interpret โ€” factories put what they need. + * Examples: { tokensIn, tokensOut } for LLM, { durationMs } for process, { exitCode } for docker. + */ + stats?: Record; + + /** Timestamps (Unix ms) */ + createdAt: number; + startedAt?: number; + endedAt?: number; +} + +/** + * 5 generic event types โ€” the minimum any agent needs. + * Factories add richness through the `output` event's content + format. + */ +export type RunEventType = 'output' | 'state' | 'error' | 'input_required' | 'result'; + +/** + * Event payloads โ€” discriminated union. + * + * `output` is the generic channel โ€” factories put anything in `content`, + * and use `format` to tell consumers how to render it. + */ +export type RunEventData = + | { type: 'output'; content: unknown; format?: string } + | { type: 'state'; state: RunState; message?: string } + | { type: 'error'; code: string; message: string; recoverable: boolean } + | { type: 'input_required'; prompt: string; schema?: JsonSchema } + | { type: 'result'; success: boolean; output?: unknown }; + +/** A single event in the run stream */ +export interface RunEvent { + type: RunEventType; + data: RunEventData; + timestamp: number; +} diff --git a/packages/core/src/types/agent.types.test.ts b/packages/core/src/types/agent.types.test.ts deleted file mode 100644 index f4df9bf..0000000 --- a/packages/core/src/types/agent.types.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -import type { Agent, AgentConfig, AgentResponse } from './agent.types'; -import type { ModelConfig, ModelDefinition } from './model.types'; - -describe('Agent Types', () => { - describe('AgentConfig', () => { - it('should allow valid config with string model', () => { - const config: AgentConfig = { - name: 'test-agent', - model: 'gpt-4', - }; - expect(config.name).toBe('test-agent'); - expect(config.model).toBe('gpt-4'); - }); - - it('should allow valid config with ModelDefinition', () => { - const modelDef: ModelDefinition = { - name: 'gpt-4', - config: { temperature: 0.7 }, - }; - const config: AgentConfig = { - name: 'test-agent', - model: modelDef, - }; - expect(config.model).toEqual(modelDef); - }); - - it('should allow optional fields', () => { - const config: AgentConfig = { - name: 'test-agent', - model: 'gpt-4', - instructions: 'You are helpful', - tools: [], - }; - expect(config.instructions).toBe('You are helpful'); - expect(config.tools).toEqual([]); - }); - }); - - describe('AgentResponse', () => { - it('should allow basic response', () => { - const response: AgentResponse = { - content: 'Hello', - }; - expect(response.content).toBe('Hello'); - }); - - it('should allow response with metadata', () => { - const response: AgentResponse = { - content: 'Hello', - metadata: { tokens: 10 }, - data: { result: 42 }, - }; - expect(response.metadata).toEqual({ tokens: 10 }); - expect(response.data).toEqual({ result: 42 }); - }); - - it('should allow response with tool calls', () => { - const response: AgentResponse = { - content: 'Called tool', - toolCalls: [ - { - name: 'search', - params: { query: 'test' }, - result: 'found', - }, - ], - }; - expect(response.toolCalls).toHaveLength(1); - }); - }); - - describe('Agent Interface', () => { - it('should define builder pattern methods', () => { - const mockAgent: Agent = { - model: () => mockAgent, - instructions: () => mockAgent, - tools: () => mockAgent, - config: () => mockAgent, - send: async () => ({ content: '' }), - stream: async function* () { - yield { content: '' }; - }, - }; - - expect(mockAgent.model).toBeDefined(); - expect(mockAgent.instructions).toBeDefined(); - expect(mockAgent.tools).toBeDefined(); - expect(mockAgent.config).toBeDefined(); - expect(mockAgent.send).toBeDefined(); - expect(mockAgent.stream).toBeDefined(); - }); - }); - - describe('ModelConfig', () => { - it('should allow all optional fields', () => { - const config: ModelConfig = {}; - expect(config).toEqual({}); - }); - - it('should allow partial config', () => { - const config: ModelConfig = { - temperature: 0.7, - maxTokens: 100, - }; - expect(config.temperature).toBe(0.7); - expect(config.maxTokens).toBe(100); - }); - - it('should allow full config', () => { - const config: ModelConfig = { - temperature: 0.7, - maxTokens: 100, - topP: 0.9, - timeout: 5000, - }; - expect(Object.keys(config)).toHaveLength(4); - }); - }); -}); diff --git a/packages/core/src/types/agent.types.ts b/packages/core/src/types/agent.types.ts deleted file mode 100644 index 5f33dc7..0000000 --- a/packages/core/src/types/agent.types.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { ConfigEntry } from './config.types.js'; -import type { ModelConfig, ModelDefinition } from './model.types.js'; -import type { Tool, ToolCall } from './tool.types.js'; - -/** - * Agent configuration interface (for config object pattern) - */ -export interface AgentConfig { - name: string; - model: string | ModelDefinition; - instructions?: string; - tools?: Tool[]; -} - -/** - * Agent response interface - */ -export interface AgentResponse { - content: string; - metadata?: Record; - data?: T; - toolCalls?: ToolCall[]; -} - -/** - * Agent interface with builder pattern support - */ -export interface Agent { - model(modelName: string, config?: ModelConfig): Agent; - instructions(text: string): Agent; - tools( - toolList: Tool[] - ): Agent; - config(configEntries: ConfigEntry[]): Agent; - send(message: string): Promise; - stream(message: string): AsyncIterableIterator; -} - -/** - * Agent factory function type (supports both builder and config patterns) - */ -export type AgentFactory = { - (name: string): Agent; - (config: AgentConfig): Agent; -}; diff --git a/packages/core/src/types/config.types.test.ts b/packages/core/src/types/config.types.test.ts deleted file mode 100644 index 5e80cfb..0000000 --- a/packages/core/src/types/config.types.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import type { - ConfigEntry, - EnvironmentConfig, - RuntimeConfig, -} from './config.types.js'; - -describe('Config Types', () => { - describe('ConfigEntry', () => { - it('should define valid config entry', () => { - const entry: ConfigEntry = { - key: 'apiKey', - value: 'sk-123', - }; - - expect(entry.key).toBe('apiKey'); - expect(entry.value).toBe('sk-123'); - expect(entry.scope).toBeUndefined(); - }); - - it('should define config entry with scope', () => { - const entry: ConfigEntry = { - key: 'timeout', - value: '30000', - scope: ['development', 'staging'], - }; - - expect(entry.key).toBe('timeout'); - expect(entry.value).toBe('30000'); - expect(entry.scope).toEqual(['development', 'staging']); - }); - }); - - describe('RuntimeConfig', () => { - it('should define valid runtime config', () => { - const config: RuntimeConfig = { - entries: [ - { key: 'apiKey', value: 'sk-123' }, - { key: 'baseUrl', value: 'https://api.example.com' }, - ], - }; - - expect(config.entries).toHaveLength(2); - expect(config.entries[0].key).toBe('apiKey'); - expect(config.entries[0].value).toBe('sk-123'); - }); - - it('should allow entries with scope', () => { - const config: RuntimeConfig = { - entries: [ - { key: 'apiKey', value: 'sk-123', scope: ['production'] }, - { key: 'timeout', value: '5000', scope: ['development', 'test'] }, - ], - }; - - expect(config.entries[0].scope).toEqual(['production']); - expect(config.entries[1].scope).toEqual(['development', 'test']); - }); - - it('should allow empty entries', () => { - const config: RuntimeConfig = { - entries: [], - }; - - expect(config.entries).toHaveLength(0); - }); - }); - - describe('EnvironmentConfig', () => { - it('should define valid environment config with all properties', () => { - const config: EnvironmentConfig = { - apiKeys: { - openai: 'sk-123', - anthropic: 'sk-456', - }, - env: { - NODE_ENV: 'production', - LOG_LEVEL: 'info', - }, - timeout: 30000, - retry: { - maxAttempts: 3, - backoff: 1000, - }, - }; - - expect(config.apiKeys?.openai).toBe('sk-123'); - expect(config.env?.NODE_ENV).toBe('production'); - expect(config.timeout).toBe(30000); - expect(config.retry?.maxAttempts).toBe(3); - }); - - it('should allow partial config', () => { - const config: EnvironmentConfig = { - timeout: 5000, - }; - - expect(config.timeout).toBe(5000); - expect(config.apiKeys).toBeUndefined(); - expect(config.retry).toBeUndefined(); - }); - - it('should allow empty config', () => { - const config: EnvironmentConfig = {}; - - expect(config).toEqual({}); - }); - }); -}); diff --git a/packages/core/src/types/config.types.ts b/packages/core/src/types/config.types.ts deleted file mode 100644 index 14d481d..0000000 --- a/packages/core/src/types/config.types.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Configuration entry for agent runtime - */ -export interface ConfigEntry { - key: string; - value: string; - scope?: string[]; -} - -/** - * Runtime configuration for agents - */ -export interface RuntimeConfig { - /** - * Configuration entries - */ - entries: ConfigEntry[]; -} - -/** - * Environment configuration - */ -export interface EnvironmentConfig { - /** - * API keys and secrets - */ - apiKeys?: Record; - - /** - * Environment variables - */ - env?: Record; - - /** - * Timeout settings in milliseconds - */ - timeout?: number; - - /** - * Retry configuration - */ - retry?: { - maxAttempts?: number; - backoff?: number; - }; -} diff --git a/packages/core/src/types/message.types.test.ts b/packages/core/src/types/message.types.test.ts deleted file mode 100644 index a2afa4d..0000000 --- a/packages/core/src/types/message.types.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { - AssistantMessage, - Message, - MessageRole, - SystemMessage, - ToolMessage, - UserMessage, -} from './message.types'; - -describe('Message Types', () => { - describe('SystemMessage', () => { - it('should allow system message', () => { - const msg: SystemMessage = { - role: 'system', - content: 'You are a helpful assistant', - }; - expect(msg.role).toBe('system'); - expect(msg.content).toBe('You are a helpful assistant'); - }); - - it('should allow optional name', () => { - const msg: SystemMessage = { - role: 'system', - content: 'Instructions', - name: 'example', - }; - expect(msg.name).toBe('example'); - }); - }); - - describe('UserMessage', () => { - it('should allow user message', () => { - const msg: UserMessage = { - role: 'user', - content: 'Hello!', - }; - expect(msg.role).toBe('user'); - expect(msg.content).toBe('Hello!'); - }); - }); - - describe('AssistantMessage', () => { - it('should allow assistant message with content', () => { - const msg: AssistantMessage = { - role: 'assistant', - content: 'Hello! How can I help?', - }; - expect(msg.role).toBe('assistant'); - expect(msg.content).toBe('Hello! How can I help?'); - }); - - it('should allow null content', () => { - const msg: AssistantMessage = { - role: 'assistant', - content: null, - }; - expect(msg.content).toBeNull(); - }); - - it('should allow tool calls', () => { - const msg: AssistantMessage = { - role: 'assistant', - content: null, - toolCalls: [ - { - name: 'get_weather', - params: { location: 'Boston' }, - result: undefined, - }, - ], - }; - expect(msg.toolCalls).toHaveLength(1); - expect(msg.toolCalls?.[0].name).toBe('get_weather'); - }); - }); - - describe('ToolMessage', () => { - it('should allow tool response message', () => { - const msg: ToolMessage = { - role: 'tool', - content: '{"temperature":72}', - toolCallId: 'call_123', - }; - expect(msg.role).toBe('tool'); - expect(msg.content).toBe('{"temperature":72}'); - expect(msg.toolCallId).toBe('call_123'); - }); - }); - - describe('Message Union Type', () => { - it('should accept any message type', () => { - const messages: Message[] = [ - { role: 'system', content: 'System prompt' }, - { role: 'user', content: 'Hello' }, - { role: 'assistant', content: 'Hi there!' }, - { role: 'tool', content: '{}', toolCallId: 'call_1' }, - ]; - expect(messages).toHaveLength(4); - expect(messages[0].role).toBe('system'); - expect(messages[1].role).toBe('user'); - expect(messages[2].role).toBe('assistant'); - expect(messages[3].role).toBe('tool'); - }); - }); - - describe('MessageRole', () => { - it('should allow valid role types', () => { - const roles: MessageRole[] = ['system', 'user', 'assistant', 'tool']; - expect(roles).toHaveLength(4); - }); - }); -}); diff --git a/packages/core/src/types/message.types.ts b/packages/core/src/types/message.types.ts deleted file mode 100644 index a883364..0000000 --- a/packages/core/src/types/message.types.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { ToolCall } from './tool.types.js'; - -/** - * Message role types - */ -export type MessageRole = 'system' | 'user' | 'assistant' | 'tool'; - -/** - * Base message interface - */ -export interface BaseMessage { - role: MessageRole; - content: string | null; - name?: string; -} - -/** - * System message for setting instructions/context - */ -export interface SystemMessage extends BaseMessage { - role: 'system'; - content: string; -} - -/** - * User message - */ -export interface UserMessage extends BaseMessage { - role: 'user'; - content: string; -} - -/** - * Assistant message with optional tool calls - */ -export interface AssistantMessage extends BaseMessage { - role: 'assistant'; - content: string | null; - toolCalls?: ToolCall[]; -} - -/** - * Tool response message - */ -export interface ToolMessage extends BaseMessage { - role: 'tool'; - content: string; - toolCallId: string; -} - -/** - * Union type of all message types - */ -export type Message = - | SystemMessage - | UserMessage - | AssistantMessage - | ToolMessage; diff --git a/packages/core/src/types/model.types.ts b/packages/core/src/types/model.types.ts deleted file mode 100644 index 9fb54df..0000000 --- a/packages/core/src/types/model.types.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Model configuration options - */ -export interface ModelConfig { - temperature?: number; - maxTokens?: number; - topP?: number; - timeout?: number; -} - -/** - * Model definition with name and optional config - */ -export interface ModelDefinition { - name: string; - config?: ModelConfig; -} diff --git a/packages/core/src/types/modelprovider.types.test.ts b/packages/core/src/types/modelprovider.types.test.ts deleted file mode 100644 index e1b9a25..0000000 --- a/packages/core/src/types/modelprovider.types.test.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import type { - Model, - ModelProvider, - ModelRequest, - ModelResponse, - SupportedModel, -} from './modelprovider.types.js'; - -describe('ModelProvider Types', () => { - describe('SupportedModel', () => { - it('should define supported model with all properties', () => { - const model: SupportedModel = { - name: 'gpt-4', - description: 'GPT-4 model', - defaultConfig: { - temperature: 0.7, - maxTokens: 4096, - }, - capabilities: { - streaming: true, - functionCalling: true, - vision: true, - }, - }; - - expect(model.name).toBe('gpt-4'); - expect(model.description).toBe('GPT-4 model'); - expect(model.defaultConfig?.temperature).toBe(0.7); - expect(model.capabilities?.streaming).toBe(true); - }); - - it('should allow minimal supported model', () => { - const model: SupportedModel = { - name: 'gpt-3.5-turbo', - }; - - expect(model.name).toBe('gpt-3.5-turbo'); - expect(model.description).toBeUndefined(); - }); - }); - - describe('ModelRequest', () => { - it('should define valid request with all properties', () => { - const request: ModelRequest = { - messages: [{ role: 'user', content: 'Hello' }], - model: 'gpt-4', - config: { - temperature: 0.7, - maxTokens: 1000, - }, - tools: [], - }; - - expect(request.model).toBe('gpt-4'); - expect(request.messages).toHaveLength(1); - expect(request.config?.temperature).toBe(0.7); - }); - - it('should allow minimal request', () => { - const request: ModelRequest = { - messages: [{ role: 'user', content: 'Hello' }], - model: 'gpt-4', - }; - - expect(request.messages).toHaveLength(1); - expect(request.config).toBeUndefined(); - }); - }); - - describe('ModelResponse', () => { - it('should define valid response with all properties', () => { - const response: ModelResponse = { - content: 'Hello! How can I help?', - toolCalls: [ - { - name: 'search', - params: { query: 'test' }, - result: null, - }, - ], - usage: { - promptTokens: 10, - completionTokens: 20, - totalTokens: 30, - }, - finishReason: 'stop', - }; - - expect(response.content).toBe('Hello! How can I help?'); - expect(response.usage?.totalTokens).toBe(30); - expect(response.finishReason).toBe('stop'); - }); - - it('should allow minimal response', () => { - const response: ModelResponse = { - content: 'Response text', - }; - - expect(response.content).toBe('Response text'); - expect(response.usage).toBeUndefined(); - }); - }); - - describe('Model', () => { - it('should implement model interface', async () => { - const model: Model = { - name: 'gpt-4', - send: async (request: ModelRequest) => ({ - content: `Echo: ${request.messages[0].content}`, - }), - }; - - const response = await model.send({ - messages: [{ role: 'user', content: 'test' }], - model: 'gpt-4', - }); - - expect(model.name).toBe('gpt-4'); - expect(response.content).toBe('Echo: test'); - }); - - it('should implement model with streaming', async () => { - const model: Model = { - name: 'gpt-4', - send: async () => ({ content: 'final' }), - stream: async function* () { - yield { content: 'Hello' }; - yield { content: ' world' }; - }, - }; - - if (model.stream) { - const chunks: string[] = []; - for await (const chunk of model.stream({ - messages: [{ role: 'user', content: 'test' }], - model: 'gpt-4', - })) { - chunks.push(chunk.content); - } - expect(chunks).toEqual(['Hello', ' world']); - } - }); - }); - - describe('ModelProvider', () => { - it('should implement provider interface', () => { - const provider: ModelProvider = { - name: 'test-provider', - getSupportedModels: () => [ - { name: 'gpt-4' }, - { name: 'gpt-3.5-turbo' }, - ], - getModel: (modelName: string) => ({ - name: modelName, - send: async () => ({ content: 'response' }), - }), - supportsModel: (modelName: string) => modelName.startsWith('gpt-'), - }; - - expect(provider.name).toBe('test-provider'); - expect(provider.getSupportedModels()).toHaveLength(2); - expect(provider.supportsModel('gpt-4')).toBe(true); - expect(provider.supportsModel('claude-3')).toBe(false); - - const model = provider.getModel('gpt-4'); - expect(model).not.toBeNull(); - expect(model?.name).toBe('gpt-4'); - }); - - it('should return null for unsupported model', () => { - const provider: ModelProvider = { - name: 'openai', - getSupportedModels: () => [{ name: 'gpt-4' }], - getModel: (modelName: string) => - modelName === 'gpt-4' - ? { name: modelName, send: async () => ({ content: 'ok' }) } - : null, - supportsModel: (modelName: string) => modelName === 'gpt-4', - }; - - expect(provider.getModel('unsupported-model')).toBeNull(); - expect(provider.supportsModel('unsupported-model')).toBe(false); - }); - - it('should get model with config', () => { - const provider: ModelProvider = { - name: 'openai', - getSupportedModels: () => [ - { - name: 'gpt-4', - defaultConfig: { temperature: 0.7 }, - }, - ], - getModel: (modelName: string, config) => ({ - name: modelName, - send: async (req) => ({ - content: `Config: ${JSON.stringify(config || req.config)}`, - }), - }), - supportsModel: () => true, - }; - - const model = provider.getModel('gpt-4', { temperature: 0.9 }); - expect(model).not.toBeNull(); - }); - }); -}); diff --git a/packages/core/src/types/modelprovider.types.ts b/packages/core/src/types/modelprovider.types.ts deleted file mode 100644 index cd963ee..0000000 --- a/packages/core/src/types/modelprovider.types.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { Message } from './message.types.js'; -import type { ModelConfig } from './model.types.js'; -import type { ToolCall } from './tool.types.js'; - -/** - * Supported model information - */ -export interface SupportedModel { - /** - * Model identifier (e.g., 'gpt-4', 'claude-3-opus') - */ - name: string; - - /** - * Model description - */ - description?: string; - - /** - * Default configuration for this model - */ - defaultConfig?: ModelConfig; - - /** - * Model capabilities - */ - capabilities?: { - streaming?: boolean; - functionCalling?: boolean; - vision?: boolean; - }; -} - -/** - * Model provider request - */ -export interface ModelRequest { - messages: Message[]; - model: string; - config?: ModelConfig; - tools?: unknown[]; -} - -/** - * Model provider response - */ -export interface ModelResponse { - content: string; - toolCalls?: ToolCall[]; - usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; - finishReason?: 'stop' | 'length' | 'tool_calls' | 'content_filter'; -} - -/** - * Model interface that providers must implement - */ -export interface Model { - /** - * Model name - */ - readonly name: string; - - /** - * Send a request to the model - */ - send(request: ModelRequest): Promise; - - /** - * Stream responses from the model - */ - stream?(request: ModelRequest): AsyncIterableIterator; -} - -/** - * Model provider adapter interface - */ -export interface ModelProvider { - /** - * Provider name (e.g., 'openai', 'anthropic') - */ - readonly name: string; - - /** - * Get list of supported models with their configurations - */ - getSupportedModels(): SupportedModel[]; - - /** - * Get a model instance by name - */ - getModel(modelName: string, config?: ModelConfig): Model | null; - - /** - * Check if the provider supports a specific model - */ - supportsModel(modelName: string): boolean; -} diff --git a/packages/core/src/types/result.types.test.ts b/packages/core/src/types/result.types.test.ts deleted file mode 100644 index 8b79160..0000000 --- a/packages/core/src/types/result.types.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import type { Failure, Result, Success } from './result.types.js'; - -describe('Result Types', () => { - describe('Success', () => { - it('should create a success result', () => { - const result: Success = { - ok: true, - data: 42, - }; - - expect(result.ok).toBe(true); - expect(result.data).toBe(42); - }); - - it('should infer correct type', () => { - const result: Success = { - ok: true, - data: 'hello', - }; - - if (result.ok) { - const value: string = result.data; - expect(value).toBe('hello'); - } - }); - }); - - describe('Failure', () => { - it('should create a failure result', () => { - const result: Failure = { - ok: false, - error: new Error('Test error'), - }; - - expect(result.ok).toBe(false); - expect(result.error).toBeInstanceOf(Error); - expect(result.error.message).toBe('Test error'); - }); - - it('should work with custom error types', () => { - interface CustomError { - code: string; - message: string; - } - - const result: Failure = { - ok: false, - error: { code: 'ERR_001', message: 'Custom error' }, - }; - - if (!result.ok) { - expect(result.error.code).toBe('ERR_001'); - expect(result.error.message).toBe('Custom error'); - } - }); - }); - - describe('Result', () => { - it('should handle success and failure cases', () => { - const divide = (a: number, b: number): Result => { - if (b === 0) { - return { ok: false, error: 'Division by zero' }; - } - return { ok: true, data: a / b }; - }; - - const successResult = divide(10, 2); - expect(successResult.ok).toBe(true); - if (successResult.ok) { - expect(successResult.data).toBe(5); - } - - const failureResult = divide(10, 0); - expect(failureResult.ok).toBe(false); - if (!failureResult.ok) { - expect(failureResult.error).toBe('Division by zero'); - } - }); - - it('should enforce type safety', () => { - const result: Result = { - ok: true, - data: 100, - }; - - if (result.ok) { - // TypeScript ensures data is number - expect(typeof result.data).toBe('number'); - } - - expect(result.ok).toBe(true); - }); - }); -}); diff --git a/packages/core/src/types/result.types.ts b/packages/core/src/types/result.types.ts deleted file mode 100644 index 3ab8393..0000000 --- a/packages/core/src/types/result.types.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Success result - */ -export type Success = { - readonly ok: true; - readonly data: T; -}; - -/** - * Failure result - */ -export type Failure = { - readonly ok: false; - readonly error: E; -}; - -/** - * Result type for functional error handling - */ -export type Result = Success | Failure; diff --git a/packages/core/src/types/tool.types.test.ts b/packages/core/src/types/tool.types.test.ts deleted file mode 100644 index b2733e6..0000000 --- a/packages/core/src/types/tool.types.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { Message } from './message.types'; -import type { - CreateToolConfig, - Tool, - ToolCall, - ToolSchema, -} from './tool.types'; - -describe('Tool Types', () => { - describe('Tool', () => { - it('should allow basic tool definition', async () => { - const tool: Tool = { - name: 'search', - description: 'Search tool', - schema: {}, - execute: async () => [ - { role: 'tool', content: 'result', toolCallId: 'call_1' }, - ], - }; - expect(tool.name).toBe('search'); - const result = await tool.execute({ query: 'test' }); - expect(result).toHaveLength(1); - expect((result as Message[])[0].role).toBe('tool'); - }); - - it('should allow typed tool with generics', async () => { - interface SearchParams { - query: string; - } - - const tool: Tool = { - name: 'search', - description: 'Search tool', - schema: {}, - execute: async (params) => [ - { - role: 'tool', - content: JSON.stringify({ results: [params.query] }), - toolCallId: 'call_1', - }, - ], - }; - - const result = await tool.execute({ query: 'test' }); - expect(result).toHaveLength(1); - expect((result as Message[])[0].role).toBe('tool'); - expect((result as Message[])[0].content).toContain('test'); - }); - }); - - describe('ToolSchema', () => { - it('should allow zod-like schema with parse', () => { - const schema = { - parse: (data: unknown) => String(data), - } as ToolSchema; - - expect(schema).toHaveProperty('parse'); - }); - - it('should allow zod-like schema with safeParse', () => { - const schema = { - safeParse: (data: unknown) => ({ - success: true, - data: String(data), - }), - } as ToolSchema; - - expect(schema).toHaveProperty('safeParse'); - }); - - it('should allow plain object schema', () => { - const schema: ToolSchema = { - type: 'object', - properties: {}, - }; - expect(schema.type).toBe('object'); - }); - }); - - describe('ToolCall', () => { - it('should allow tool call result', () => { - const toolCall: ToolCall = { - name: 'search', - params: { query: 'test' }, - result: { found: true }, - }; - expect(toolCall.name).toBe('search'); - expect(toolCall.params).toEqual({ query: 'test' }); - expect(toolCall.result).toEqual({ found: true }); - }); - }); - - describe('CreateToolConfig', () => { - it('should allow tool creation config', () => { - const config: CreateToolConfig = { - name: 'test', - description: 'Test tool', - inputSchema: {}, - }; - expect(config.name).toBe('test'); - }); - }); -}); diff --git a/packages/core/src/types/tool.types.ts b/packages/core/src/types/tool.types.ts deleted file mode 100644 index 7c0dd64..0000000 --- a/packages/core/src/types/tool.types.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Tool schema definition - can be any schema validator (e.g., Zod schema) - */ -export type ToolSchema = - | { - parse?: (data: unknown) => T; - safeParse?: (data: unknown) => { - success: boolean; - data?: T; - error?: unknown; - }; - _type?: T; - } - | Record; - -/** - * Infer the type from a schema - */ -export type InferSchemaType = TSchema extends { - parse: (data: unknown) => infer T; -} - ? T - : TSchema extends { _type: infer T } - ? T - : TSchema extends Record unknown }> - ? { - [K in keyof TSchema]: TSchema[K] extends { - parse?: (data: unknown) => infer U; - } - ? U - : never; - } - : unknown; - -/** - * Tool definition interface with generic type support - */ -export interface Tool { - name: string; - description: string; - schema: ToolSchema; - execute: (params: TParams) => Promise; -} - -/** - * Tool call result - */ -export interface ToolCall { - name: string; - params: unknown; - result: unknown; -} - -/** - * Tool creation configuration with automatic type inference from schema - */ -export interface CreateToolConfig { - name: string; - title?: string; - description: string; - inputSchema: TSchema; -} - -/** - * Tool execute function type - */ -export type ToolExecuteFunction = ( - params: InferSchemaType -) => Promise; - -/** - * Tool factory function type with automatic type inference - */ -export type ToolFactory = ( - config: CreateToolConfig, - execute: ToolExecuteFunction -) => Tool, TResult>; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 90d76d7..9264cb7 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,8 +1,10 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" + "outDir": "dist", + "rootDir": "src", + "composite": true }, - "include": ["src/**/*"] + "include": ["src"], + "exclude": ["src/**/*.test.ts"] } diff --git a/packages/model-openai/.gitignore b/packages/model-openai/.gitignore deleted file mode 100644 index 24df64b..0000000 --- a/packages/model-openai/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules/ -dist/ -coverage/ -*.log -*.tgz -.DS_Store -.env -.env.local diff --git a/packages/model-openai/.npmignore b/packages/model-openai/.npmignore deleted file mode 100644 index c435169..0000000 --- a/packages/model-openai/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -# Source files -src/ -*.test.ts - -# Config files -tsconfig.json -jest.config.js -eslint.config.js - -# Coverage -coverage/ -*.tsbuildinfo - -# IDE -.vscode/ -.idea/ - -# OS -.DS_Store -Thumbs.db diff --git a/packages/model-openai/LICENSE b/packages/model-openai/LICENSE deleted file mode 100644 index 5c83d89..0000000 --- a/packages/model-openai/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Agentage Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/model-openai/README.md b/packages/model-openai/README.md deleted file mode 100644 index 9d1d7ba..0000000 --- a/packages/model-openai/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# @agentage/model-openai - -OpenAI model adapter for AgentKit. - -## Installation - -```bash -npm install @agentage/model-openai -``` - -## Usage - -```typescript -import { OPENAI_MODEL_NAME } from '@agentage/model-openai'; - -console.log(OPENAI_MODEL_NAME); // "openai" -``` - -## Development - -```bash -# Install dependencies -npm install - -# Build -npm run build - -# Test -npm run test - -# Lint -npm run lint - -# Type check -npm run type-check - -# Verify all -npm run verify - -# Clean -npm run clean -``` - -## License - -MIT diff --git a/packages/model-openai/eslint.config.js b/packages/model-openai/eslint.config.js deleted file mode 100644 index 3a1b734..0000000 --- a/packages/model-openai/eslint.config.js +++ /dev/null @@ -1,46 +0,0 @@ -import typescriptEslint from '@typescript-eslint/eslint-plugin'; -import tsParser from '@typescript-eslint/parser'; - -export default [ - { - files: ['**/*.ts'], - languageOptions: { - parser: tsParser, - parserOptions: { - ecmaVersion: 2022, - sourceType: 'module', - project: './tsconfig.json', - }, - }, - plugins: { - '@typescript-eslint': typescriptEslint, - }, - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/explicit-function-return-type': 'warn', - '@typescript-eslint/no-unused-vars': [ - 'error', - { argsIgnorePattern: '^_' }, - ], - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'interface', - format: ['PascalCase'], - custom: { - regex: '^[A-Z]', - match: true, - }, - }, - { - selector: 'typeAlias', - format: ['PascalCase'], - }, - ], - 'prefer-const': 'error', - 'prefer-arrow-callback': 'error', - 'arrow-body-style': ['error', 'as-needed'], - 'no-var': 'error', - }, - }, -]; diff --git a/packages/model-openai/jest.config.js b/packages/model-openai/jest.config.js deleted file mode 100644 index 8bc81c1..0000000 --- a/packages/model-openai/jest.config.js +++ /dev/null @@ -1,27 +0,0 @@ -export default { - preset: 'ts-jest/presets/default-esm', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - '^@agentage/core$': '/../core/src/index.ts', - }, - transform: { - '^.+\\.ts$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - testMatch: ['**/*.test.ts'], - collectCoverageFrom: ['src/**/*.ts', '!src/**/*.test.ts', '!src/**/*.d.ts'], - coverageThreshold: { - global: { - branches: 70, - functions: 70, - lines: 70, - statements: 70, - }, - }, -}; diff --git a/packages/model-openai/package.json b/packages/model-openai/package.json deleted file mode 100644 index 129f7df..0000000 --- a/packages/model-openai/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "@agentage/model-openai", - "version": "0.1.0", - "description": "OpenAI model adapter for AgentKit", - "type": "module", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "scripts": { - "build": "tsc", - "type-check": "tsc --noEmit", - "lint": "eslint src --ext .ts", - "lint:fix": "eslint src --ext .ts --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage", - "verify": "npm run type-check && npm run lint && npm run build && npm run test", - "clean": "rm -rf dist coverage", - "prepublishOnly": "npm run verify" - }, - "keywords": [ - "agentkit", - "openai", - "model", - "ai", - "typescript" - ], - "author": "Agentage", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/agentage/agentkit.git", - "directory": "packages/model-openai" - }, - "bugs": { - "url": "https://github.com/agentage/agentkit/issues" - }, - "homepage": "https://github.com/agentage/agentkit/tree/master/packages/model-openai#readme", - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - }, - "dependencies": { - "@agentage/core": "^0.1.0", - "openai": "^6.29.0" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "typescript": "^5.9.3" - } -} diff --git a/packages/model-openai/src/index.test.ts b/packages/model-openai/src/index.test.ts deleted file mode 100644 index c9077de..0000000 --- a/packages/model-openai/src/index.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { OPENAI_MODEL_NAME } from './index.js'; - -describe('OpenAI Model', () => { - test('OPENAI_MODEL_NAME is defined', () => { - expect(OPENAI_MODEL_NAME).toBe('openai'); - }); -}); diff --git a/packages/model-openai/src/index.ts b/packages/model-openai/src/index.ts deleted file mode 100644 index 3f3adec..0000000 --- a/packages/model-openai/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from '@agentage/core'; - -export const OPENAI_MODEL_NAME = 'openai'; diff --git a/packages/model-openai/tsconfig.json b/packages/model-openai/tsconfig.json deleted file mode 100644 index 884f4c6..0000000 --- a/packages/model-openai/tsconfig.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "lib": ["ES2022"], - "moduleResolution": "bundler", - "resolveJsonModule": true, - "allowJs": false, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictBindCallApply": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/packages/platform/package.json b/packages/platform/package.json new file mode 100644 index 0000000..9508539 --- /dev/null +++ b/packages/platform/package.json @@ -0,0 +1,55 @@ +{ + "name": "@agentage/platform", + "version": "0.2.0", + "description": "Daemon/hub protocol types for the Agentage platform", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "files": ["dist"], + "engines": { + "node": ">=22.0.0", + "npm": ">=10.0.0" + }, + "peerDependencies": { + "@agentage/core": "^0.2.0" + }, + "devDependencies": {}, + "scripts": { + "build": "tsc", + "type-check": "tsc --noEmit", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "format": "prettier --write \"src/**/*.ts\" \"!src/**/*.d.ts\"", + "format:check": "prettier --check \"src/**/*.ts\" \"!src/**/*.d.ts\"", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "clean": "rm -rf dist *.tsbuildinfo coverage src/**/*.d.ts", + "verify": "npm run type-check && npm run lint && npm run format:check && npm run test && npm run build", + "prepublishOnly": "npm run verify" + }, + "keywords": [ + "agentage", + "platform", + "daemon", + "hub", + "protocol" + ], + "author": "Agentage", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/agentage/agentkit.git", + "directory": "packages/platform" + }, + "bugs": { + "url": "https://github.com/agentage/agentkit/issues" + }, + "homepage": "https://github.com/agentage/agentkit/tree/master/packages/platform#readme" +} diff --git a/packages/platform/src/constants.test.ts b/packages/platform/src/constants.test.ts new file mode 100644 index 0000000..762458b --- /dev/null +++ b/packages/platform/src/constants.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from 'vitest'; +import { + HEARTBEAT_INTERVAL, + OFFLINE_THRESHOLD, + WS_RECONNECT_BASE, + WS_RECONNECT_MAX, +} from './constants.js'; + +describe('platform constants', () => { + it('HEARTBEAT_INTERVAL is 30_000', () => { + expect(HEARTBEAT_INTERVAL).toBe(30_000); + }); + + it('OFFLINE_THRESHOLD is 90_000 (3x heartbeat)', () => { + expect(OFFLINE_THRESHOLD).toBe(90_000); + expect(OFFLINE_THRESHOLD).toBe(3 * HEARTBEAT_INTERVAL); + }); + + it('WS_RECONNECT_BASE is 1_000', () => { + expect(WS_RECONNECT_BASE).toBe(1_000); + }); + + it('WS_RECONNECT_MAX is 30_000', () => { + expect(WS_RECONNECT_MAX).toBe(30_000); + }); +}); diff --git a/packages/platform/src/constants.ts b/packages/platform/src/constants.ts new file mode 100644 index 0000000..294731b --- /dev/null +++ b/packages/platform/src/constants.ts @@ -0,0 +1,11 @@ +/** Default heartbeat interval (ms) */ +export const HEARTBEAT_INTERVAL = 30_000; + +/** Machine is considered offline after this many missed heartbeats (ms) */ +export const OFFLINE_THRESHOLD = 3 * HEARTBEAT_INTERVAL; // 90_000 + +/** WebSocket reconnect delay base (ms) โ€” with exponential backoff */ +export const WS_RECONNECT_BASE = 1_000; + +/** WebSocket reconnect delay max (ms) */ +export const WS_RECONNECT_MAX = 30_000; diff --git a/packages/platform/src/index.ts b/packages/platform/src/index.ts new file mode 100644 index 0000000..40b31cd --- /dev/null +++ b/packages/platform/src/index.ts @@ -0,0 +1,27 @@ +export type { + Machine, + Heartbeat, + AgentInfo, + MachineRegisterRequest, + MachineRegisterResponse, + HeartbeatRequest, + HeartbeatResponse, + Command, + WsExecuteRequest, + WsExecuteAccepted, + WsExecuteRejected, + WsRunEvent, + WsRunStateChange, + WsCancel, + WsSendInput, + WsHubMessage, + WsDaemonMessage, + WsMessage, +} from './types.js'; + +export { + HEARTBEAT_INTERVAL, + OFFLINE_THRESHOLD, + WS_RECONNECT_BASE, + WS_RECONNECT_MAX, +} from './constants.js'; diff --git a/packages/platform/src/types.test.ts b/packages/platform/src/types.test.ts new file mode 100644 index 0000000..067b131 --- /dev/null +++ b/packages/platform/src/types.test.ts @@ -0,0 +1,94 @@ +import { describe, expect, it } from 'vitest'; +import type { + AgentInfo, + Heartbeat, + Machine, + WsDaemonMessage, + WsExecuteRequest, + WsHubMessage, + WsMessage, + WsRunEvent, +} from './types.js'; + +describe('platform types (compile-only)', () => { + it('Machine object satisfies Machine type', () => { + const machine: Machine = { + id: 'test-id', + name: 'test-machine', + platform: 'linux', + arch: 'x64', + daemonVersion: '0.2.0', + agents: [], + status: 'online', + lastSeenAt: Date.now(), + }; + expect(machine.id).toBe('test-id'); + }); + + it('Heartbeat object satisfies Heartbeat type', () => { + const heartbeat: Heartbeat = { + machineId: 'test-id', + agents: [], + activeRunIds: ['run-1'], + resources: { cpuUsage: 50, memoryUsedMb: 1024, memoryTotalMb: 2048 }, + }; + expect(heartbeat.machineId).toBe('test-id'); + }); + + it('WsExecuteRequest satisfies WsHubMessage', () => { + const msg: WsHubMessage = { + type: 'execute', + requestId: 'req-1', + agentName: 'test', + input: { task: 'hello' }, + }; + expect(msg.type).toBe('execute'); + }); + + it('WsRunEvent satisfies WsDaemonMessage', () => { + const msg: WsDaemonMessage = { + type: 'run_event', + runId: 'run-1', + event: { + type: 'output', + data: { type: 'output', content: 'hello', format: 'text' }, + timestamp: Date.now(), + }, + }; + expect(msg.type).toBe('run_event'); + }); + + it('WsMessage is union of hub + daemon messages', () => { + const hubMsg: WsMessage = { + type: 'execute', + requestId: 'req-1', + agentName: 'test', + input: { task: 'hello' }, + } satisfies WsExecuteRequest; + + const daemonMsg: WsMessage = { + type: 'run_event', + runId: 'run-1', + event: { + type: 'output', + data: { type: 'output', content: 'hello' }, + timestamp: Date.now(), + }, + } satisfies WsRunEvent; + + expect(hubMsg.type).toBe('execute'); + expect(daemonMsg.type).toBe('run_event'); + }); + + it('AgentInfo extends AgentManifest correctly', () => { + const info: AgentInfo = { + name: 'test-agent', + path: '/tmp/test', + machineId: 'machine-1', + machineName: 'my-machine', + machineStatus: 'online', + }; + expect(info.name).toBe('test-agent'); + expect(info.machineId).toBe('machine-1'); + }); +}); diff --git a/packages/platform/src/types.ts b/packages/platform/src/types.ts new file mode 100644 index 0000000..4349762 --- /dev/null +++ b/packages/platform/src/types.ts @@ -0,0 +1,139 @@ +import type { AgentManifest, Run, RunEvent, RunInput } from '@agentage/core'; + +/** Machine info โ€” sent by daemon on registration */ +export interface Machine { + /** Unique machine ID (generated by daemon on first run, persisted locally) */ + id: string; + + /** Human-readable name (hostname or user-provided) */ + name: string; + + /** OS platform */ + platform: 'darwin' | 'win32' | 'linux'; + + /** CPU architecture */ + arch: 'x64' | 'arm64'; + + /** Daemon version */ + daemonVersion: string; + + /** Agent manifests discovered on this machine (from factories) */ + agents: AgentManifest[]; + + /** Online status (derived from heartbeat โ€” set by hub, not daemon) */ + status: 'online' | 'offline'; + + /** Last heartbeat timestamp (Unix ms, set by hub) */ + lastSeenAt: number; +} + +/** Heartbeat payload โ€” sent by daemon periodically */ +export interface Heartbeat { + machineId: string; + + /** Updated agent list (in case agents changed since last heartbeat) */ + agents: AgentManifest[]; + + /** Currently active run IDs on this machine */ + activeRunIds: string[]; + + /** Machine resource snapshot (optional) */ + resources?: { + cpuUsage?: number; + memoryUsedMb?: number; + memoryTotalMb?: number; + }; +} + +/** Agent as seen from the hub โ€” manifest + which machine it's on */ +export interface AgentInfo extends AgentManifest { + machineId: string; + machineName: string; + machineStatus: 'online' | 'offline'; +} + +// โ”€โ”€โ”€ Protocol โ€” REST โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export interface MachineRegisterRequest { + machine: Omit; + authToken: string; +} + +export interface MachineRegisterResponse { + machineId: string; + /** Token for WebSocket connection */ + connectionToken: string; +} + +export type HeartbeatRequest = Heartbeat; + +export interface HeartbeatResponse { + /** Pending commands for this machine */ + pendingCommands: Command[]; +} + +// โ”€โ”€โ”€ Command โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export interface Command { + id: string; + type: 'cancel' | 'input'; + runId: string; + /** Input text for 'input' type */ + payload?: string; +} + +// โ”€โ”€โ”€ Protocol โ€” WebSocket โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +/** Execute an agent on this machine (hub โ†’ daemon) */ +export interface WsExecuteRequest { + type: 'execute'; + requestId: string; + agentName: string; + input: RunInput; +} + +/** Cancel a running execution (hub โ†’ daemon) */ +export interface WsCancel { + type: 'cancel'; + runId: string; +} + +/** Send input to a waiting agent (hub โ†’ daemon) */ +export interface WsSendInput { + type: 'input'; + runId: string; + text: string; +} + +/** Execution accepted โ€” run created (daemon โ†’ hub) */ +export interface WsExecuteAccepted { + type: 'execute_accepted'; + requestId: string; + runId: string; +} + +/** Execution rejected โ€” agent not found, busy, etc. (daemon โ†’ hub) */ +export interface WsExecuteRejected { + type: 'execute_rejected'; + requestId: string; + reason: string; +} + +/** Run event โ€” streamed during execution (daemon โ†’ hub) */ +export interface WsRunEvent { + type: 'run_event'; + runId: string; + event: RunEvent; +} + +/** Run state changed โ€” full run record (daemon โ†’ hub) */ +export interface WsRunStateChange { + type: 'run_state'; + run: Run; +} + +// โ”€โ”€โ”€ Union types โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +export type WsHubMessage = WsExecuteRequest | WsCancel | WsSendInput; +export type WsDaemonMessage = WsExecuteAccepted | WsExecuteRejected | WsRunEvent | WsRunStateChange; +export type WsMessage = WsHubMessage | WsDaemonMessage; diff --git a/packages/platform/tsconfig.json b/packages/platform/tsconfig.json new file mode 100644 index 0000000..e586a6f --- /dev/null +++ b/packages/platform/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "composite": true + }, + "references": [ + { "path": "../core" } + ], + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/packages/sdk/.npmignore b/packages/sdk/.npmignore deleted file mode 100644 index 1ce1357..0000000 --- a/packages/sdk/.npmignore +++ /dev/null @@ -1,34 +0,0 @@ -# Source files -src/ -*.test.ts - -# Development files -.vscode/ -eslint.config.js -.prettierrc.json -.prettierignore -jest.config.js -tsconfig.json - -# Testing -coverage/ -.nyc_output/ - -# Documentation -docs/ - -# Git -.git/ -.gitignore - -# Environment -.env -.env.* - -# Logs -*.log - -# Temporary -tmp/ -temp/ -*.tmp diff --git a/packages/sdk/.prettierignore b/packages/sdk/.prettierignore deleted file mode 100644 index 7406cde..0000000 --- a/packages/sdk/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -dist -coverage -*.md -LICENSE diff --git a/packages/sdk/.prettierrc.json b/packages/sdk/.prettierrc.json deleted file mode 100644 index 3171de5..0000000 --- a/packages/sdk/.prettierrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "semi": true, - "trailingComma": "es5", - "singleQuote": true, - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "arrowParens": "always", - "endOfLine": "lf" -} diff --git a/packages/sdk/README.md b/packages/sdk/README.md deleted file mode 100644 index b726c3c..0000000 --- a/packages/sdk/README.md +++ /dev/null @@ -1,247 +0,0 @@ -# @agentage/sdk - -AgentKit SDK - Core interface definitions and types for building AI agents. - -## Installation - -```bash -npm install @agentage/sdk -``` - -## Usage - -### Pattern 1: Builder (Express-like) - -```typescript -import { agent, tool } from '@agentage/sdk'; -import type { Agent, AgentResponse } from '@agentage/sdk'; - -const assistant: Agent = agent('assistant') - .model('gpt-4', { temperature: 0.7, maxTokens: 2000 }) - .instructions('You are a helpful assistant') - .tools([searchTool, calculatorTool]); - -const result: AgentResponse = await assistant.send('Help me with this task'); -console.log(result.content); -``` - -### Pattern 2: Config Object - -```typescript -import { agent } from '@agentage/sdk'; -import type { AgentConfig, Agent } from '@agentage/sdk'; - -const config: AgentConfig = { - name: 'assistant', - model: { - name: 'gpt-4', - config: { temperature: 0.7, maxTokens: 2000 } - }, - instructions: 'You are a helpful assistant', - tools: [searchTool, calculatorTool], -}; - -const assistant: Agent = agent(config); -const result = await assistant.send('Help me with this'); -``` - -### Defining Tools - -```typescript -import { tool } from '@agentage/sdk'; -import type { Tool } from '@agentage/sdk'; -import { z } from 'zod'; - -// Type-safe tool definition with explicit types -type GithubParams = { - repo: string; - action: 'get' | 'list' | 'search'; -}; -type GithubResult = { name: string; stars: number }; - -const githubTool: Tool = tool( - { - name: 'github', - title: 'GitHub Tool', - description: 'Access GitHub repositories', - inputSchema: { - repo: z.string(), - action: z.enum(['get', 'list', 'search']), - } - }, - async ({ repo, action }) => { - const response = await fetch(`https://api.github.com/repos/${repo}`); - const data = await response.json(); - return { name: data.name, stars: data.stargazers_count }; - } -); - -// Simple tool with inferred types -const databaseTool = tool( - { - name: 'database', - title: 'Database Tool', - description: 'Query database', - inputSchema: { - query: z.string(), - limit: z.number().optional(), - } - }, - async ({ query, limit = 10 }) => { - return await db.execute(query, { limit }); - } -); -``` - -### Streaming Responses - -```typescript -const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are a helpful assistant'); - -for await (const chunk of assistant.stream('Tell me a story')) { - console.log(chunk.content); -} -``` - -## Type Definitions - -### Core Interfaces - -#### `Agent` -Main interface with builder pattern methods: -- `model(modelName: string, config?: ModelConfig): Agent` -- `instructions(text: string): Agent` -- `tools(toolList: Tool[]): Agent` -- `config(configEntries: Array<{ key: string; value: string }>): Agent` -- `send(message: string): Promise` -- `stream(message: string): AsyncIterableIterator` - -#### `AgentConfig` -Configuration object for creating agents: -```typescript -interface AgentConfig { - name: string; - model: string | ModelDefinition; - instructions?: string; - tools?: Tool[]; -} -``` - -#### `Tool` -Tool definition with generic type support: -```typescript -interface Tool { - name: string; - description: string; - schema: ToolSchema; - execute: (params: TParams) => Promise; -} -``` - -#### `AgentResponse` -Response from agent operations: -```typescript -interface AgentResponse { - content: string; - metadata?: Record; - data?: T; - toolCalls?: ToolCall[]; -} -``` - -#### `ModelConfig` -Model configuration options: -```typescript -interface ModelConfig { - temperature?: number; - maxTokens?: number; - topP?: number; - timeout?: number; -} -``` - -#### `ModelDefinition` -Model with explicit configuration: -```typescript -interface ModelDefinition { - name: string; - config?: ModelConfig; -} -``` - -### Factory Types - -#### `AgentFactory` -Factory function supporting both patterns: -```typescript -type AgentFactory = { - (name: string): Agent; - (config: AgentConfig): Agent; -}; -``` - -#### `ToolFactory` -Type-safe tool creation with separate config and execute parameters: -```typescript -type ToolFactory = ( - config: CreateToolConfig, - execute: ToolExecuteFunction -) => Tool, TResult>; -``` - -#### `CreateToolConfig` -Configuration for creating tools (first parameter): -```typescript -interface CreateToolConfig { - name: string; - title?: string; - description: string; - inputSchema: TSchema; -} -``` - -#### `ToolExecuteFunction` -Execute function type (second parameter): -```typescript -type ToolExecuteFunction = ( - params: InferSchemaType -) => Promise; -``` - -## Features - -โœ… **Full TypeScript Support** - Complete type definitions with generics -โœ… **Zod Integration** - Built-in support for Zod schemas -โœ… **Builder Pattern** - Fluent, chainable API -โœ… **Config Object Pattern** - Declarative configuration -โœ… **Type-Safe Tools** - Generic tool definitions with parameter and result typing -โœ… **Streaming Support** - Async iteration for streaming responses -โœ… **Zero Dependencies** - Pure interface definitions - -## Development - -```bash -# Install dependencies -npm install - -# Build -npm run build - -# Test -npm run test - -# Lint -npm run lint - -# Type check -npm run type-check - -# Verify all -npm run verify -``` - -## License - -MIT diff --git a/packages/sdk/eslint.config.js b/packages/sdk/eslint.config.js deleted file mode 100644 index 10a5990..0000000 --- a/packages/sdk/eslint.config.js +++ /dev/null @@ -1,52 +0,0 @@ -import typescriptEslint from '@typescript-eslint/eslint-plugin'; -import tsParser from '@typescript-eslint/parser'; - -export default [ - { - files: ['**/*.ts'], - languageOptions: { - parser: tsParser, - parserOptions: { - ecmaVersion: 2022, - sourceType: 'module', - project: './tsconfig.json', - }, - }, - plugins: { - '@typescript-eslint': typescriptEslint, - }, - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/explicit-function-return-type': 'warn', - '@typescript-eslint/no-unused-vars': [ - 'error', - { argsIgnorePattern: '^_' }, - ], - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'interface', - format: ['PascalCase'], - custom: { - regex: '^[A-Z]', - match: true, - }, - }, - { - selector: 'typeAlias', - format: ['PascalCase'], - }, - ], - 'prefer-const': 'error', - 'prefer-arrow-callback': 'error', - 'arrow-body-style': ['error', 'as-needed'], - 'no-var': 'error', - }, - }, - { - files: ['**/*.test.ts'], - rules: { - '@typescript-eslint/no-explicit-any': 'off', - }, - }, -]; diff --git a/packages/sdk/jest.config.js b/packages/sdk/jest.config.js deleted file mode 100644 index 56623c3..0000000 --- a/packages/sdk/jest.config.js +++ /dev/null @@ -1,27 +0,0 @@ -export default { - preset: 'ts-jest/presets/default-esm', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - '^@agentage/core$': '/../core/src/index.ts', - }, - transform: { - '^.+\\.ts$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - testMatch: ['**/*.test.ts'], - collectCoverageFrom: ['src/**/*.ts', '!src/**/*.test.ts', '!src/**/*.d.ts'], - coverageThreshold: { - global: { - branches: 39, - functions: 70, - lines: 59, - statements: 58, - }, - }, -}; diff --git a/packages/sdk/package.json b/packages/sdk/package.json deleted file mode 100644 index c6abecf..0000000 --- a/packages/sdk/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "@agentage/sdk", - "version": "0.1.1", - "description": "Simple SDK for building AI agents in Node.js with type-safe tools and model adapters", - "type": "module", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "scripts": { - "dev": "tsx src/index.ts", - "build": "tsc", - "type-check": "tsc --noEmit", - "lint": "eslint src --ext .ts", - "lint:fix": "eslint src --ext .ts --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage", - "clean": "rm -rf dist *.tsbuildinfo", - "verify": "npm run type-check && npm run lint && npm run build && npm run test", - "prepublishOnly": "npm run verify" - }, - "keywords": [ - "agentkit", - "sdk", - "typescript" - ], - "author": "Agentage", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/agentage/agentkit.git", - "directory": "packages/sdk" - }, - "bugs": { - "url": "https://github.com/agentage/agentkit/issues" - }, - "homepage": "https://github.com/agentage/agentkit/tree/master/packages/sdk#readme", - "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" - }, - "dependencies": { - "@agentage/core": "^0.1.0", - "openai": "^6.29.0", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/jest": "^30.0.0", - "@types/node": "^25.5.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.39.4", - "jest": "^30.3.0", - "ts-jest": "^29.4.6", - "tsx": "^4.21.0", - "typescript": "^5.9.3" - } -} diff --git a/packages/sdk/src/agent.test.ts b/packages/sdk/src/agent.test.ts deleted file mode 100644 index 67b4bf5..0000000 --- a/packages/sdk/src/agent.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { Tool } from '@agentage/core'; -import { z } from 'zod'; -import { agent, convertToOpenAITool } from './agent'; -import { tool } from './tool'; - -describe('Agent', () => { - describe('convertToOpenAITool', () => { - it('should convert tool name to OpenAI function name', () => { - const searchTool = tool( - { - name: 'search', - description: 'Search the web', - inputSchema: { - query: z.string().describe('Search query'), - }, - }, - async () => [] - ); - - const result = convertToOpenAITool(searchTool); - - expect(result).toEqual({ - type: 'function', - function: { - name: 'search', - description: 'Search the web', - parameters: { - type: 'object', - properties: { - query: { - type: 'string', - description: 'Search query', - }, - }, - required: ['query'], - }, - }, - }); - }); - }); - - describe('agent builder', () => { - it('should create agent with tools', () => { - const searchTool = tool( - { - name: 'search', - description: 'Search', - inputSchema: { - query: z.string(), - }, - }, - async () => [] - ); - - const assistant = agent('assistant').tools([ - searchTool as Tool, - ]); - - const config = (assistant as any).getConfig(); - expect(config.tools).toHaveLength(1); - expect(config.tools[0].name).toBe('search'); - }); - }); -}); diff --git a/packages/sdk/src/agent.ts b/packages/sdk/src/agent.ts deleted file mode 100644 index 585233a..0000000 --- a/packages/sdk/src/agent.ts +++ /dev/null @@ -1,275 +0,0 @@ -import type { - Agent, - AgentConfig, - AgentResponse, - ModelConfig, - Tool, -} from '@agentage/core'; -import OpenAI from 'openai'; -import { toJSONSchema } from 'zod'; -import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions'; -import { - MissingApiKeyError, - NotImplementedError, - ToolNotFoundError, - UnsupportedModelError, -} from './errors.js'; - -/** - * OpenAI tool definition - */ -interface OpenAITool { - type: 'function'; - function: { - name: string; - description: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - parameters: any; - }; -} - -/** - * Convert Zod schema object to JSON Schema - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function convertSchemaToJsonSchema(schema: any): any { - // If schema is empty object, return it as-is - if (Object.keys(schema).length === 0) { - return schema; - } - - // Convert each property from Zod to JSON Schema - const properties: Record = {}; - const required: string[] = []; - - for (const [key, value] of Object.entries(schema)) { - // Check if it's a Zod schema (has _zod property in Zod 4.x) - if (value && typeof value === 'object' && ('_zod' in value || '_def' in value)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const jsonSchema = toJSONSchema(value as any); - - // Extract the actual schema (remove top-level $schema if present) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { $schema, ...cleanSchema } = jsonSchema as Record; - properties[key] = cleanSchema; - - // Check if the field is optional (Zod 4.x uses _zod.def.type) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const zodDef = (value as any)._zod?.def; - if (zodDef?.type !== 'optional') { - required.push(key); - } - } else { - // If not a Zod schema, pass through as-is - properties[key] = value; - } - } - - return { - type: 'object', - properties, - ...(required.length > 0 && { required }), - }; -} - -/** - * Convert agent tool to OpenAI tool format - */ -function convertToOpenAITool( - tool: Tool -): OpenAITool { - return { - type: 'function', - function: { - name: tool.name, - description: tool.description, - parameters: convertSchemaToJsonSchema(tool.schema), - }, - }; -} - -/** - * Agent builder implementation - */ -class AgentBuilder implements Agent { - private _name: string; - private _modelName?: string; - private _modelConfig?: ModelConfig; - private _instructions?: string; - private _tools?: Tool[]; - private _config?: Record; - - constructor(name: string) { - this._name = name; - } - - model(modelName: string, config?: ModelConfig): Agent { - this._modelName = modelName; - this._modelConfig = config; - return this; - } - - instructions(text: string): Agent { - this._instructions = text; - return this; - } - - tools( - toolList: Tool[] - ): Agent { - this._tools = toolList as Tool[]; - return this; - } - - config(configEntries: Array<{ key: string; value: string }>): Agent { - this._config = configEntries.reduce((acc, entry) => { - acc[entry.key] = entry.value; - return acc; - }, {} as Record); - return this; - } - - async send(message: string): Promise { - const modelName = this._modelName || 'gpt-4'; - - // Only support GPT-4 for now - if (!modelName.startsWith('gpt-4')) { - throw new UnsupportedModelError(modelName); - } - - const apiKey = this._config?.OPENAI_API_KEY; - if (!apiKey) { - throw new MissingApiKeyError(); - } - - const openai = new OpenAI({ apiKey }); - - const messages: ChatCompletionMessageParam[] = []; - - if (this._instructions) { - messages.push({ role: 'system', content: this._instructions }); - } - - messages.push({ role: 'user', content: message }); - - // Convert tools to OpenAI format - const tools = this._tools?.map(convertToOpenAITool); - - let response = await openai.chat.completions.create({ - model: modelName, - messages, - tools: tools && tools.length > 0 ? tools : undefined, - temperature: this._modelConfig?.temperature, - max_tokens: this._modelConfig?.maxTokens, - top_p: this._modelConfig?.topP, - }); - - let choice = response.choices[0]; - - // Handle tool calls - while (choice.finish_reason === 'tool_calls' && choice.message.tool_calls) { - // Add assistant message with tool_calls - messages.push({ - role: 'assistant', - content: choice.message.content, - tool_calls: choice.message.tool_calls, - }); - - // Execute each tool call and add tool messages - for (const toolCall of choice.message.tool_calls) { - // OpenAI v6 uses union type, we only handle function tool calls - if (toolCall.type !== 'function') { - continue; - } - - const tool = this._tools?.find( - (t) => t.name === toolCall.function.name - ); - if (!tool) { - throw new ToolNotFoundError(toolCall.function.name); - } - - // Parse arguments and execute tool - const args = JSON.parse(toolCall.function.arguments); - const result = await tool.execute(args); - - // Add tool result message - messages.push({ - role: 'tool', - content: JSON.stringify(result), - tool_call_id: toolCall.id, - }); - } - - // Continue conversation with tool results - response = await openai.chat.completions.create({ - model: modelName, - messages, - tools: tools && tools.length > 0 ? tools : undefined, - temperature: this._modelConfig?.temperature, - max_tokens: this._modelConfig?.maxTokens, - top_p: this._modelConfig?.topP, - }); - - choice = response.choices[0]; - } - - return { - content: choice.message.content || '', - metadata: { - id: response.id, - model: response.model, - usage: response.usage, - finishReason: choice.finish_reason, - }, - }; - } - - async *stream(_message: string): AsyncIterableIterator { - throw new NotImplementedError('Agent.stream()'); - yield { content: '' }; // Make TypeScript happy - } - - getConfig(): AgentConfig { - return { - name: this._name, - model: this._modelConfig - ? { name: this._modelName || 'gpt-4', config: this._modelConfig } - : this._modelName || 'gpt-4', - instructions: this._instructions, - tools: this._tools, - }; - } -} - -/** - * Create an agent using builder pattern or config object - */ -export function agent(nameOrConfig: string | AgentConfig): Agent { - if (typeof nameOrConfig === 'string') { - return new AgentBuilder(nameOrConfig); - } - - const builder = new AgentBuilder(nameOrConfig.name); - - if (typeof nameOrConfig.model === 'string') { - builder.model(nameOrConfig.model); - } else { - builder.model(nameOrConfig.model.name, nameOrConfig.model.config); - } - - if (nameOrConfig.instructions) { - builder.instructions(nameOrConfig.instructions); - } - - if (nameOrConfig.tools) { - builder.tools(nameOrConfig.tools); - } - - return builder; -} - -/** - * Export for testing - */ -export { convertToOpenAITool }; diff --git a/packages/sdk/src/errors.test.ts b/packages/sdk/src/errors.test.ts deleted file mode 100644 index f42e782..0000000 --- a/packages/sdk/src/errors.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { - AgentKitError, - MissingApiKeyError, - NotImplementedError, - ToolNotFoundError, - UnsupportedModelError, -} from './errors.js'; - -describe('Error Classes', () => { - describe('AgentKitError', () => { - it('should create base error with correct name and message', () => { - const error = new AgentKitError('Test error'); - - expect(error).toBeInstanceOf(Error); - expect(error).toBeInstanceOf(AgentKitError); - expect(error.name).toBe('AgentKitError'); - expect(error.message).toBe('Test error'); - }); - }); - - describe('UnsupportedModelError', () => { - it('should create error with model name', () => { - const error = new UnsupportedModelError('claude-3'); - - expect(error).toBeInstanceOf(AgentKitError); - expect(error.name).toBe('UnsupportedModelError'); - expect(error.message).toBe('Model claude-3 is not supported'); - }); - }); - - describe('MissingApiKeyError', () => { - it('should create error with helpful message', () => { - const error = new MissingApiKeyError(); - - expect(error).toBeInstanceOf(AgentKitError); - expect(error.name).toBe('MissingApiKeyError'); - expect(error.message).toContain('API key is required'); - expect(error.message).toContain('OPENAI_API_KEY'); - }); - }); - - describe('ToolNotFoundError', () => { - it('should create error with tool name', () => { - const error = new ToolNotFoundError('search'); - - expect(error).toBeInstanceOf(AgentKitError); - expect(error.name).toBe('ToolNotFoundError'); - expect(error.message).toBe('Tool "search" not found'); - }); - }); - - describe('NotImplementedError', () => { - it('should create error with feature name', () => { - const error = new NotImplementedError('Agent.stream()'); - - expect(error).toBeInstanceOf(AgentKitError); - expect(error.name).toBe('NotImplementedError'); - expect(error.message).toBe('Agent.stream() is not yet implemented'); - }); - }); -}); diff --git a/packages/sdk/src/errors.ts b/packages/sdk/src/errors.ts deleted file mode 100644 index ff072be..0000000 --- a/packages/sdk/src/errors.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Base error class for SDK errors - */ -export class AgentKitError extends Error { - constructor(message: string) { - super(message); - this.name = 'AgentKitError'; - } -} - -/** - * Error thrown when a model is not supported - */ -export class UnsupportedModelError extends AgentKitError { - constructor(modelName: string) { - super(`Model ${modelName} is not supported`); - this.name = 'UnsupportedModelError'; - } -} - -/** - * Error thrown when API key is missing - */ -export class MissingApiKeyError extends AgentKitError { - constructor() { - super( - 'API key is required. Use .config([{ key: "OPENAI_API_KEY", value: "..." }])' - ); - this.name = 'MissingApiKeyError'; - } -} - -/** - * Error thrown when a tool is not found - */ -export class ToolNotFoundError extends AgentKitError { - constructor(toolName: string) { - super(`Tool "${toolName}" not found`); - this.name = 'ToolNotFoundError'; - } -} - -/** - * Error thrown when a feature is not implemented - */ -export class NotImplementedError extends AgentKitError { - constructor(feature: string) { - super(`${feature} is not yet implemented`); - this.name = 'NotImplementedError'; - } -} diff --git a/packages/sdk/src/index.test.ts b/packages/sdk/src/index.test.ts deleted file mode 100644 index 49d16f2..0000000 --- a/packages/sdk/src/index.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { version } from './index.js'; - -describe('SDK', () => { - test('exports version', () => { - expect(version).toBe('0.0.1'); - }); -}); diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts deleted file mode 100644 index d9f355a..0000000 --- a/packages/sdk/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from '@agentage/core'; -export * from './agent.js'; -export * from './errors.js'; -export * from './tool.js'; - -export const version = '0.0.1'; diff --git a/packages/sdk/src/sdk.test.ts b/packages/sdk/src/sdk.test.ts deleted file mode 100644 index 21251da..0000000 --- a/packages/sdk/src/sdk.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { agent } from './agent'; -import { tool } from './tool'; - -describe('SDK', () => { - describe('agent builder pattern', () => { - it('should create agent with builder pattern', () => { - const assistant = agent('assistant') - .model('gpt-4', { temperature: 0.7 }) - .instructions('You are helpful'); - - const config = (assistant as any).getConfig(); - expect(config.name).toBe('assistant'); - expect(config.model).toEqual({ - name: 'gpt-4', - config: { temperature: 0.7 }, - }); - expect(config.instructions).toBe('You are helpful'); - }); - - it('should create agent with config object', () => { - const assistant = agent({ - name: 'assistant', - model: 'gpt-4', - instructions: 'You are helpful', - }); - - const config = (assistant as any).getConfig(); - expect(config.name).toBe('assistant'); - expect(config.model).toBe('gpt-4'); - }); - - it('should create agent with config object with model definition', () => { - const assistant = agent({ - name: 'assistant', - model: { - name: 'gpt-4', - config: { temperature: 0.5 }, - }, - instructions: 'You are helpful', - }); - - const config = (assistant as any).getConfig(); - expect(config.name).toBe('assistant'); - expect(config.model).toEqual({ - name: 'gpt-4', - config: { temperature: 0.5 }, - }); - }); - - it('should create agent with tools', () => { - const searchTool = tool( - { - name: 'search', - description: 'Search', - inputSchema: {}, - }, - async () => [] - ); - - const assistant = agent('assistant').tools([searchTool as any]); - - const config = (assistant as any).getConfig(); - expect(config.tools).toHaveLength(1); - expect(config.tools[0].name).toBe('search'); - }); - - it('should create agent with config method', () => { - const assistant = agent('test').config([ - { key: 'OPENAI_API_KEY', value: 'test-key' }, - ]); - - expect(assistant).toBeDefined(); - }); - - it('should create agent with default model', () => { - const assistant = agent('test'); - const config = (assistant as any).getConfig(); - expect(config.name).toBe('test'); - expect(config.model).toBe('gpt-4'); - }); - - it('should throw error when send is called without API key', async () => { - const assistant = agent('test').model('gpt-4'); - await expect(assistant.send('hello')).rejects.toThrow( - 'API key is required' - ); - }); - - it('should throw error for unsupported model', async () => { - const assistant = agent('test') - .model('claude-3') - .config([{ key: 'OPENAI_API_KEY', value: 'fake-key' }]); - await expect(assistant.send('hello')).rejects.toThrow('is not supported'); - }); - - it('should throw error for stream method', async () => { - const assistant = agent('test'); - const streamGen = assistant.stream('hello'); - await expect(streamGen.next()).rejects.toThrow('is not yet implemented'); - }); - }); - - describe('tool factory', () => { - it('should create tool', async () => { - const searchTool = tool( - { - name: 'search', - description: 'Search the web', - inputSchema: {}, - }, - async () => [{ role: 'tool', content: 'result', toolCallId: 'call_1' }] - ); - - expect(searchTool.name).toBe('search'); - expect(searchTool.description).toBe('Search the web'); - const result = await searchTool.execute({}); - expect(result).toHaveLength(1); - }); - - it('should create tool with schema', () => { - const searchTool = tool( - { - name: 'search', - description: 'Search the web', - inputSchema: { - type: 'object', - properties: { - query: { type: 'string' }, - }, - }, - }, - async () => [] - ); - - expect(searchTool.schema).toEqual({ - type: 'object', - properties: { - query: { type: 'string' }, - }, - }); - }); - }); -}); diff --git a/packages/sdk/src/tool.ts b/packages/sdk/src/tool.ts deleted file mode 100644 index 9b37b57..0000000 --- a/packages/sdk/src/tool.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { - CreateToolConfig, - InferSchemaType, - Tool, - ToolExecuteFunction, -} from '@agentage/core'; - -/** - * Create a tool with the given configuration - * The params type is automatically inferred from the schema - */ -export function tool( - config: CreateToolConfig, - execute: ToolExecuteFunction -): Tool, TResult> { - return { - name: config.name, - description: config.description, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - schema: config.inputSchema as any, - execute, - }; -} diff --git a/packages/sdk/src/types/agent.types.test.ts b/packages/sdk/src/types/agent.types.test.ts deleted file mode 100644 index 0e0086b..0000000 --- a/packages/sdk/src/types/agent.types.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { - AgentConfig, - AgentResponse, - ModelConfig, - ModelDefinition, - Tool, - ToolCall, -} from './agent.types.js'; - -describe('Agent Types', () => { - test('AgentConfig interface with string model', () => { - const config: AgentConfig = { - name: 'test-agent', - model: 'gpt-4', - instructions: 'You are a helpful assistant', - }; - - expect(config.name).toBe('test-agent'); - expect(config.model).toBe('gpt-4'); - }); - - test('AgentConfig interface with ModelDefinition', () => { - const modelDef: ModelDefinition = { - name: 'gpt-4', - config: { - temperature: 0.7, - maxTokens: 2000, - }, - }; - - const config: AgentConfig = { - name: 'test-agent', - model: modelDef, - instructions: 'You are a helpful assistant', - }; - - expect(config.name).toBe('test-agent'); - expect(typeof config.model === 'object' && config.model.name).toBe('gpt-4'); - }); - - test('ModelConfig interface is properly structured', () => { - const modelConfig: ModelConfig = { - temperature: 0.7, - maxTokens: 1000, - topP: 0.9, - timeout: 30000, - }; - - expect(modelConfig.temperature).toBe(0.7); - expect(modelConfig.timeout).toBe(30000); - }); - - test('Tool interface is properly structured', () => { - const tool: Tool = { - name: 'test-tool', - description: 'A test tool', - schema: { type: 'object' }, - execute: async (params) => params, - }; - - expect(tool.name).toBe('test-tool'); - }); - - test('Tool interface with generic types', () => { - type TestParams = { query: string }; - type TestResult = { success: boolean }; - - const tool: Tool = { - name: 'typed-tool', - description: 'A typed tool', - schema: { type: 'object' }, - execute: async (_params: TestParams): Promise => ({ - success: true, - }), - }; - - expect(tool.name).toBe('typed-tool'); - }); - - test('AgentResponse interface is properly structured', () => { - const response: AgentResponse = { - content: 'Hello, how can I help?', - metadata: { tokens: 10 }, - }; - - expect(response.content).toBeDefined(); - }); - - test('AgentResponse with tool calls', () => { - const toolCall: ToolCall = { - name: 'search', - params: { query: 'test' }, - result: { items: [] }, - }; - - const response: AgentResponse = { - content: 'Here are the results', - toolCalls: [toolCall], - data: { processed: true }, - }; - - expect(response.toolCalls).toHaveLength(1); - expect(response.toolCalls?.[0].name).toBe('search'); - }); -}); diff --git a/packages/sdk/src/types/agent.types.ts b/packages/sdk/src/types/agent.types.ts deleted file mode 100644 index b24d770..0000000 --- a/packages/sdk/src/types/agent.types.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Model configuration options - */ -export interface ModelConfig { - temperature?: number; - maxTokens?: number; - topP?: number; - timeout?: number; -} - -/** - * Model definition with name and optional config - */ -export interface ModelDefinition { - name: string; - config?: ModelConfig; -} - -/** - * Tool schema definition - can be any schema validator (e.g., Zod schema) - */ -export type ToolSchema = - | { - parse?: (data: unknown) => T; - safeParse?: (data: unknown) => { - success: boolean; - data?: T; - error?: unknown; - }; - _type?: T; - } - | Record; - -/** - * Tool definition interface with generic type support - */ -export interface Tool { - name: string; - description: string; - schema: ToolSchema; - execute: (params: TParams) => Promise; -} - -/** - * Agent configuration interface (for config object pattern) - */ -export interface AgentConfig { - name: string; - model: string | ModelDefinition; - instructions?: string; - tools?: Tool[]; -} - -/** - * Agent response interface - */ -export interface AgentResponse { - content: string; - metadata?: Record; - data?: T; - toolCalls?: ToolCall[]; -} - -/** - * Tool call result - */ -export interface ToolCall { - name: string; - params: unknown; - result: unknown; -} - -/** - * Agent interface with builder pattern support - */ -export interface Agent { - model(modelName: string, config?: ModelConfig): Agent; - instructions(text: string): Agent; - tools(toolList: Tool[]): Agent; - send(message: string): Promise; - stream(message: string): AsyncIterableIterator; -} diff --git a/packages/sdk/src/types/factory.types.ts b/packages/sdk/src/types/factory.types.ts deleted file mode 100644 index 5b86ade..0000000 --- a/packages/sdk/src/types/factory.types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { - Agent, - AgentConfig, - CreateToolConfig, - Tool, - ToolExecuteFunction, -} from '@agentage/core'; - -/** - * Tool factory function type - */ -export type ToolFactory = ( - config: CreateToolConfig, - execute: ToolExecuteFunction -) => Tool; - -/** - * Agent factory function type (supports both builder and config patterns) - */ -export type AgentFactory = { - (name: string): Agent; - (config: AgentConfig): Agent; -}; diff --git a/packages/sdk/src/types/sdk.types.ts b/packages/sdk/src/types/sdk.types.ts deleted file mode 100644 index f4e3333..0000000 --- a/packages/sdk/src/types/sdk.types.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * SDK configuration options - */ -export interface SdkConfig { - apiKey?: string; - baseUrl?: string; - timeout?: number; -} - -/** - * SDK client interface - */ -export interface SdkClient { - readonly config: SdkConfig; - initialize(): Promise; -} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json deleted file mode 100644 index 884f4c6..0000000 --- a/packages/sdk/tsconfig.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "lib": ["ES2022"], - "moduleResolution": "bundler", - "resolveJsonModule": true, - "allowJs": false, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictBindCallApply": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/tsconfig.json b/tsconfig.json index c52c4f8..4d873f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,30 +1,25 @@ { "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "lib": ["ES2022"], - "moduleResolution": "bundler", - "resolveJsonModule": true, - "allowJs": false, - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "removeComments": true, + "target": "ES2024", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2024"], "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictBindCallApply": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true }, - "exclude": ["node_modules", "dist", "build", "coverage"] + "references": [ + { "path": "packages/core" }, + { "path": "packages/platform" } + ], + "exclude": ["node_modules", "dist", "coverage"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..0ad2db3 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['packages/*/src/**/*.test.ts'], + coverage: { + provider: 'v8', + include: ['packages/*/src/**/*.ts'], + exclude: ['**/*.test.ts', '**/*.types.ts', '**/index.ts'], + thresholds: { + branches: 70, + functions: 70, + lines: 70, + statements: 70, + }, + }, + }, +}); From c7318e41e2784e0e91c7a63ef34b0b0a149d44fa Mon Sep 17 00:00:00 2001 From: Volodymyr Vreshch Date: Fri, 20 Mar 2026 01:47:59 +0100 Subject: [PATCH 2/2] fix: restore icons in CI/CD workflow step names --- .github/workflows/ci.yml | 14 ++--- .github/workflows/pr-validation.yml | 48 ++++++++--------- .github/workflows/publish.yml | 80 ++++++++++++++--------------- 3 files changed, 71 insertions(+), 71 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c43c727..44e9174 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,24 +13,24 @@ env: jobs: test: - name: Verify Packages + name: ๐Ÿงช Verify Packages runs-on: ubuntu-latest steps: - - name: Checkout code + - name: ๐Ÿ“ฅ Checkout code uses: actions/checkout@v5 - - name: Setup Node.js + - name: ๐Ÿ”ง Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - - name: Install dependencies + - name: ๐Ÿ“ฆ Install dependencies run: npm ci - - name: Verify all packages + - name: โœ… Verify all packages run: npm run verify - - name: All checks passed - run: echo "All CI checks passed successfully!" + - name: โœ… All checks passed + run: echo "๐ŸŽ‰ All CI checks passed successfully!" diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index ad202bf..306d95f 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -17,50 +17,50 @@ env: jobs: validate: - name: Validate Pull Request + name: ๐Ÿ” Validate Pull Request runs-on: ubuntu-latest outputs: validation-result: ${{ steps.validation-summary.outputs.result }} pr-comment-body: ${{ steps.validation-summary.outputs.comment-body }} steps: - - name: Checkout code + - name: ๐Ÿ“ฅ Checkout code uses: actions/checkout@v5 - - name: Setup Node.js + - name: ๐Ÿ”ง Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - - name: Install dependencies + - name: ๐Ÿ“ฆ Install dependencies run: npm ci - - name: Type check + - name: ๐Ÿ” Type check id: type-check run: npm run type-check - - name: Lint + - name: ๐ŸŽจ Lint id: lint run: npm run lint - - name: Format check + - name: ๐ŸŽจ Format check id: format-check run: npm run format:check - - name: Test + - name: ๐Ÿงช Test id: test run: npm run test - - name: Test Coverage + - name: ๐Ÿ“Š Test Coverage id: coverage run: npm run test:coverage - - name: Build + - name: ๐Ÿ—๏ธ Build id: build run: npm run build - - name: Validation Summary + - name: ๐Ÿ“Š Validation Summary id: validation-summary if: always() run: | @@ -68,35 +68,35 @@ jobs: cat << 'EOF' >> $GITHUB_OUTPUT comment-body< comment.body.includes(workflowSignature) && comment.user.login === 'github-actions[bot]'); diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2661bc6..043b65b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,26 +16,26 @@ env: jobs: detect-changes: - name: Detect Version Changes + name: ๐Ÿ” Detect Version Changes runs-on: ubuntu-latest outputs: packages: ${{ steps.detect.outputs.packages }} has-changes: ${{ steps.detect.outputs.has-changes }} steps: - - name: Checkout code + - name: ๐Ÿ“ฅ Checkout code uses: actions/checkout@v5 - - name: Setup Node.js + - name: ๐Ÿ”ง Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - - name: Install dependencies + - name: ๐Ÿ“ฆ Install dependencies run: npm ci - - name: Detect changed package versions + - name: ๐Ÿ” Detect changed package versions id: detect run: | # Function to get package info @@ -87,13 +87,13 @@ jobs: IFS='|' read -r dir name version <<< "$pkg_info" - echo "Checking ${name}@${version}..." + echo "๐Ÿ“ฆ Checking ${name}@${version}..." # Check if this version exists on npm if version_exists_on_npm "$name" "$version"; then - echo "Version ${version} already published for ${name}" + echo "โญ๏ธ Version ${version} already published for ${name}" else - echo "New version detected: ${name}@${version}" + echo "โœจ New version detected: ${name}@${version}" changed_packages+=("{\"name\":\"${name}\",\"version\":\"${version}\",\"dir\":\"${dir}\"}") fi done @@ -102,17 +102,17 @@ jobs: if [ ${#changed_packages[@]} -eq 0 ]; then echo "has-changes=false" >> $GITHUB_OUTPUT echo "packages=[]" >> $GITHUB_OUTPUT - echo "No version changes detected" + echo "โ„น๏ธ No version changes detected" else echo "has-changes=true" >> $GITHUB_OUTPUT packages_json=$(printf '%s\n' "${changed_packages[@]}" | jq -s -c '.') echo "packages=${packages_json}" >> $GITHUB_OUTPUT - echo "Packages to publish:" + echo "๐ŸŽฏ Packages to publish:" echo "${packages_json}" | jq '.' fi verify: - name: Verify ${{ matrix.package.name }}@${{ matrix.package.version }} + name: โœ… Verify ${{ matrix.package.name }}@${{ matrix.package.version }} needs: [detect-changes] if: needs.detect-changes.outputs.has-changes == 'true' runs-on: ubuntu-latest @@ -122,33 +122,33 @@ jobs: fail-fast: true steps: - - name: Checkout code + - name: ๐Ÿ“ฅ Checkout code uses: actions/checkout@v5 - - name: Setup Node.js + - name: ๐Ÿ”ง Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - - name: Install dependencies + - name: ๐Ÿ“ฆ Install dependencies run: npm ci - - name: Build all workspace packages + - name: ๐Ÿ—๏ธ Build all workspace packages run: npm run build - - name: Run verification + - name: โœ… Run verification working-directory: ${{ matrix.package.dir }} run: | - echo "Verifying ${{ matrix.package.name }}@${{ matrix.package.version }}" + echo "๐Ÿ” Verifying ${{ matrix.package.name }}@${{ matrix.package.version }}" npm run verify - - name: Verification passed + - name: โœ… Verification passed run: | - echo "${{ matrix.package.name }}@${{ matrix.package.version }} verified successfully" >> $GITHUB_STEP_SUMMARY + echo "โœ… ${{ matrix.package.name }}@${{ matrix.package.version }} verified successfully" >> $GITHUB_STEP_SUMMARY publish: - name: Publish ${{ matrix.package.name }}@${{ matrix.package.version }} + name: ๐Ÿ“ค Publish ${{ matrix.package.name }}@${{ matrix.package.version }} needs: [detect-changes, verify] if: needs.detect-changes.outputs.has-changes == 'true' && needs.verify.result == 'success' runs-on: ubuntu-latest @@ -159,31 +159,31 @@ jobs: fail-fast: true steps: - - name: Checkout code + - name: ๐Ÿ“ฅ Checkout code uses: actions/checkout@v5 - - name: Setup Node.js + - name: ๐Ÿ”ง Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" registry-url: "https://registry.npmjs.org" - - name: Install dependencies + - name: ๐Ÿ“ฆ Install dependencies run: npm ci - - name: Build all workspace packages + - name: ๐Ÿ—๏ธ Build all workspace packages run: npm run build - - name: Publish to npm + - name: ๐Ÿ“ค Publish to npm working-directory: ${{ matrix.package.dir }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - echo "Publishing ${{ matrix.package.name }}@${{ matrix.package.version }}" + echo "๐Ÿ“ค Publishing ${{ matrix.package.name }}@${{ matrix.package.version }}" npm publish --access public --provenance - - name: Create git tag + - name: ๐Ÿท๏ธ Create git tag run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" @@ -195,33 +195,33 @@ jobs: git tag -a "${TAG_NAME}" -m "Release ${{ matrix.package.name }}@${{ matrix.package.version }}" git push origin "${TAG_NAME}" - - name: Published successfully + - name: โœ… Published successfully run: | - echo "Successfully published ${{ matrix.package.name }}@${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY - echo "Package URL: https://www.npmjs.com/package/${{ matrix.package.name }}/v/${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY + echo "๐ŸŽ‰ Successfully published ${{ matrix.package.name }}@${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY + echo "๐Ÿ“ฆ Package URL: https://www.npmjs.com/package/${{ matrix.package.name }}/v/${{ matrix.package.version }}" >> $GITHUB_STEP_SUMMARY summary: - name: Publish Summary + name: ๐Ÿ“‹ Publish Summary needs: [detect-changes, verify, publish] if: always() && needs.detect-changes.outputs.has-changes == 'true' runs-on: ubuntu-latest steps: - - name: Create summary + - name: ๐Ÿ“Š Create summary run: | - echo "## Package Publishing Summary" >> $GITHUB_STEP_SUMMARY + echo "## ๐Ÿ“ฆ Package Publishing Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ "${{ needs.verify.result }}" != "success" ]; then - echo "**Verification failed - packages not published**" >> $GITHUB_STEP_SUMMARY + echo "โŒ **Verification failed - packages not published**" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "Please fix verification errors and try again." >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.publish.result }}" == "success" ]; then - echo "**All packages published successfully!**" >> $GITHUB_STEP_SUMMARY + echo "โœ… **All packages published successfully!**" >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.publish.result }}" == "skipped" ]; then - echo "**Publishing skipped - verification failed**" >> $GITHUB_STEP_SUMMARY + echo "โญ๏ธ **Publishing skipped - verification failed**" >> $GITHUB_STEP_SUMMARY else - echo "**Some packages failed to publish**" >> $GITHUB_STEP_SUMMARY + echo "โš ๏ธ **Some packages failed to publish**" >> $GITHUB_STEP_SUMMARY fi echo "" >> $GITHUB_STEP_SUMMARY @@ -231,9 +231,9 @@ jobs: packages='${{ needs.detect-changes.outputs.packages }}' if [ "${{ needs.verify.result }}" == "success" ] && [ "${{ needs.publish.result }}" == "success" ]; then - echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Published"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- โœ… **\(.name)** version \(.version) - Published"' >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.verify.result }}" != "success" ]; then - echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Verification failed"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- โŒ **\(.name)** version \(.version) - Verification failed"' >> $GITHUB_STEP_SUMMARY else - echo "$packages" | jq -r '.[] | "- **\(.name)** version \(.version) - Skipped"' >> $GITHUB_STEP_SUMMARY + echo "$packages" | jq -r '.[] | "- โญ๏ธ **\(.name)** version \(.version) - Skipped"' >> $GITHUB_STEP_SUMMARY fi