Rename @cua/ to @trycua/, move ts example to ./examples, rename workflows for better organization

This commit is contained in:
Morgan Dean
2025-06-30 10:14:52 -07:00
parent 8bfa8fbc92
commit b0666df203
30 changed files with 825 additions and 516 deletions

View File

@@ -20,7 +20,7 @@ jobs:
- run: uname -a
- run: sudo xcode-select -s /Applications/Xcode_16.app # Swift 6.0
- run: swift test
working-directory: ./libs/swift/lume
working-directory: ./libs/lume
build:
name: Release build
runs-on: macos-15
@@ -29,4 +29,4 @@ jobs:
- run: uname -a
- run: sudo xcode-select -s /Applications/Xcode_16.app # Swift 6.0
- run: swift build --configuration release
working-directory: ./libs/swift/lume
working-directory: ./libs/lume

View File

@@ -1,9 +1,9 @@
name: Publish @cua/computer to npm
name: Publish @trycua/computer to npm
on:
push:
tags:
- 'computer-v*'
- "computer-v*"
jobs:
publish:
@@ -15,7 +15,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: 'https://registry.npmjs.org'
registry-url: "https://registry.npmjs.org"
- name: Install dependencies
working-directory: ./libs/typescript/computer

View File

@@ -1,9 +1,9 @@
name: Publish @cua/core to npm
name: Publish @trycua/core to npm
on:
push:
tags:
- 'core-v*'
- "core-v*"
jobs:
publish:
@@ -15,7 +15,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: 'https://registry.npmjs.org'
registry-url: "https://registry.npmjs.org"
- name: Install dependencies
working-directory: ./libs/typescript/core

View File

@@ -85,7 +85,7 @@ jobs:
# Update version in Main.swift
echo "Updating version in Main.swift to $VERSION"
sed -i '' "s/static let current: String = \".*\"/static let current: String = \"$VERSION\"/" libs/swift/lume/src/Main.swift
sed -i '' "s/static let current: String = \".*\"/static let current: String = \"$VERSION\"/" libs/lume/src/Main.swift
# Set output for later steps
echo "version=$VERSION" >> $GITHUB_OUTPUT
@@ -147,7 +147,7 @@ jobs:
CERT_APPLICATION_NAME: "Developer ID Application: ${{ secrets.DEVELOPER_NAME }} (${{ secrets.TEAM_ID }})"
CERT_INSTALLER_NAME: "Developer ID Installer: ${{ secrets.DEVELOPER_NAME }} (${{ secrets.TEAM_ID }})"
VERSION: ${{ steps.set_version.outputs.version }}
working-directory: ./libs/swift/lume
working-directory: ./libs/lume
run: |
# Minimal debug information
echo "Starting build process..."
@@ -185,7 +185,7 @@ jobs:
- name: Generate SHA256 Checksums
id: generate_checksums
working-directory: ./libs/swift/lume/.release
working-directory: ./libs/lume/.release
run: |
# Use existing checksums file if it exists, otherwise generate one
if [ -f "checksums.txt" ]; then
@@ -208,7 +208,7 @@ jobs:
ls -la
- name: Create Standard Version Releases
working-directory: ./libs/swift/lume/.release
working-directory: ./libs/lume/.release
run: |
VERSION=${{ steps.set_version.outputs.version }}
ARCH=$(uname -m)
@@ -230,14 +230,14 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: lume-notarized-tarball
path: ./libs/swift/lume/${{ steps.build_notarize.outputs.tarball_path }}
path: ./libs/lume/${{ steps.build_notarize.outputs.tarball_path }}
if-no-files-found: error
- name: Upload Notarized Package (Installer)
uses: actions/upload-artifact@v4
with:
name: lume-notarized-installer
path: ./libs/swift/lume/${{ steps.build_notarize.outputs.pkg_path }}
path: ./libs/lume/${{ steps.build_notarize.outputs.pkg_path }}
if-no-files-found: error
- name: Create Release
@@ -245,18 +245,18 @@ jobs:
uses: softprops/action-gh-release@v1
with:
files: |
./libs/swift/lume/${{ steps.build_notarize.outputs.tarball_path }}
./libs/swift/lume/${{ steps.build_notarize.outputs.pkg_path }}
./libs/swift/lume/.release/lume-darwin.tar.gz
./libs/swift/lume/.release/lume-darwin.pkg.tar.gz
./libs/swift/lume/.release/lume.tar.gz
./libs/swift/lume/.release/lume.pkg.tar.gz
./libs/lume/${{ steps.build_notarize.outputs.tarball_path }}
./libs/lume/${{ steps.build_notarize.outputs.pkg_path }}
./libs/lume/.release/lume-darwin.tar.gz
./libs/lume/.release/lume-darwin.pkg.tar.gz
./libs/lume/.release/lume.tar.gz
./libs/lume/.release/lume.pkg.tar.gz
body: |
${{ steps.generate_checksums.outputs.checksums }}
### Installation with script
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/swift/lume/scripts/install.sh)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh)"
```
generate_release_notes: true
make_latest: true

View File

@@ -141,7 +141,7 @@ jobs:
publish:
needs: prepare
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "agent"
package_dir: "libs/python/agent"

View File

@@ -61,7 +61,7 @@ jobs:
publish:
needs: prepare
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "computer-server"
package_dir: "libs/python/computer-server"

View File

@@ -121,7 +121,7 @@ jobs:
publish:
needs: prepare
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "computer"
package_dir: "libs/python/computer"

View File

@@ -52,7 +52,7 @@ jobs:
publish:
needs: prepare
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "core"
package_dir: "libs/python/core"

View File

@@ -137,7 +137,7 @@ jobs:
publish:
needs: prepare
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "mcp-server"
package_dir: "libs/python/mcp-server"

View File

@@ -71,7 +71,7 @@ jobs:
publish:
needs: determine-version
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "pylume"
package_dir: "libs/python/pylume"

View File

@@ -56,7 +56,7 @@ jobs:
publish:
needs: determine-version
uses: ./.github/workflows/reusable-publish.yml
uses: ./.github/workflows/pypi-reusable-publish.yml
with:
package_name: "som"
package_dir: "libs/python/som"

View File

@@ -1,10 +1,10 @@
# cua-cloud-openai Example
This example demonstrates how to control a c/ua Cloud container using the OpenAI `computer-use-preview` model and the `@cua/computer` TypeScript library.
This example demonstrates how to control a c/ua Cloud container using the OpenAI `computer-use-preview` model and the `@trycua/computer` TypeScript library.
## Overview
- Connects to a c/ua Cloud container via the `@cua/computer` library
- Connects to a c/ua Cloud container via the `@trycua/computer` library
- Sends screenshots and instructions to OpenAI's computer-use model
- Executes AI-generated actions (clicks, typing, etc.) inside the container
- Designed for Linux containers, but can be adapted for other OS types
@@ -12,6 +12,7 @@ This example demonstrates how to control a c/ua Cloud container using the OpenAI
## Getting Started
1. **Install dependencies:**
```bash
npm install
```
@@ -23,6 +24,7 @@ This example demonstrates how to control a c/ua Cloud container using the OpenAI
- `CUA_CONTAINER_NAME` — the name of your provisioned container
3. **Run the example:**
```bash
npx tsx src/index.ts
```

View File

@@ -13,7 +13,7 @@
"license": "MIT",
"packageManager": "pnpm@10.12.3",
"dependencies": {
"@cua/computer": "link:../../computer",
"@trycua/computer": "link:../../libs/typescript/computer",
"dotenv": "^16.5.0",
"openai": "^5.7.0"
},

View File

@@ -0,0 +1,362 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
'@trycua/computer':
specifier: link:../../libs/typescript/computer
version: link:../../libs/typescript/computer
dotenv:
specifier: ^16.5.0
version: 16.6.1
openai:
specifier: ^5.7.0
version: 5.8.2
devDependencies:
'@types/node':
specifier: ^22.15.33
version: 22.15.34
tsx:
specifier: ^4.20.3
version: 4.20.3
typescript:
specifier: ^5.8.3
version: 5.8.3
packages:
'@esbuild/aix-ppc64@0.25.5':
resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.25.5':
resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.25.5':
resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.25.5':
resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.25.5':
resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.25.5':
resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.25.5':
resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.25.5':
resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.25.5':
resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.25.5':
resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.25.5':
resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.25.5':
resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.25.5':
resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.25.5':
resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.25.5':
resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.25.5':
resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.25.5':
resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.25.5':
resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.25.5':
resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.25.5':
resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.25.5':
resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/sunos-x64@0.25.5':
resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.25.5':
resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.25.5':
resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.25.5':
resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@types/node@22.15.34':
resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==}
dotenv@16.6.1:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
esbuild@0.25.5:
resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
engines: {node: '>=18'}
hasBin: true
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
get-tsconfig@4.10.1:
resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
openai@5.8.2:
resolution: {integrity: sha512-8C+nzoHYgyYOXhHGN6r0fcb4SznuEn1R7YZMvlqDbnCuE0FM2mm3T1HiYW6WIcMS/F1Of2up/cSPjLPaWt0X9Q==}
hasBin: true
peerDependencies:
ws: ^8.18.0
zod: ^3.23.8
peerDependenciesMeta:
ws:
optional: true
zod:
optional: true
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
tsx@4.20.3:
resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==}
engines: {node: '>=18.0.0'}
hasBin: true
typescript@5.8.3:
resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
engines: {node: '>=14.17'}
hasBin: true
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
snapshots:
'@esbuild/aix-ppc64@0.25.5':
optional: true
'@esbuild/android-arm64@0.25.5':
optional: true
'@esbuild/android-arm@0.25.5':
optional: true
'@esbuild/android-x64@0.25.5':
optional: true
'@esbuild/darwin-arm64@0.25.5':
optional: true
'@esbuild/darwin-x64@0.25.5':
optional: true
'@esbuild/freebsd-arm64@0.25.5':
optional: true
'@esbuild/freebsd-x64@0.25.5':
optional: true
'@esbuild/linux-arm64@0.25.5':
optional: true
'@esbuild/linux-arm@0.25.5':
optional: true
'@esbuild/linux-ia32@0.25.5':
optional: true
'@esbuild/linux-loong64@0.25.5':
optional: true
'@esbuild/linux-mips64el@0.25.5':
optional: true
'@esbuild/linux-ppc64@0.25.5':
optional: true
'@esbuild/linux-riscv64@0.25.5':
optional: true
'@esbuild/linux-s390x@0.25.5':
optional: true
'@esbuild/linux-x64@0.25.5':
optional: true
'@esbuild/netbsd-arm64@0.25.5':
optional: true
'@esbuild/netbsd-x64@0.25.5':
optional: true
'@esbuild/openbsd-arm64@0.25.5':
optional: true
'@esbuild/openbsd-x64@0.25.5':
optional: true
'@esbuild/sunos-x64@0.25.5':
optional: true
'@esbuild/win32-arm64@0.25.5':
optional: true
'@esbuild/win32-ia32@0.25.5':
optional: true
'@esbuild/win32-x64@0.25.5':
optional: true
'@types/node@22.15.34':
dependencies:
undici-types: 6.21.0
dotenv@16.6.1: {}
esbuild@0.25.5:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.5
'@esbuild/android-arm': 0.25.5
'@esbuild/android-arm64': 0.25.5
'@esbuild/android-x64': 0.25.5
'@esbuild/darwin-arm64': 0.25.5
'@esbuild/darwin-x64': 0.25.5
'@esbuild/freebsd-arm64': 0.25.5
'@esbuild/freebsd-x64': 0.25.5
'@esbuild/linux-arm': 0.25.5
'@esbuild/linux-arm64': 0.25.5
'@esbuild/linux-ia32': 0.25.5
'@esbuild/linux-loong64': 0.25.5
'@esbuild/linux-mips64el': 0.25.5
'@esbuild/linux-ppc64': 0.25.5
'@esbuild/linux-riscv64': 0.25.5
'@esbuild/linux-s390x': 0.25.5
'@esbuild/linux-x64': 0.25.5
'@esbuild/netbsd-arm64': 0.25.5
'@esbuild/netbsd-x64': 0.25.5
'@esbuild/openbsd-arm64': 0.25.5
'@esbuild/openbsd-x64': 0.25.5
'@esbuild/sunos-x64': 0.25.5
'@esbuild/win32-arm64': 0.25.5
'@esbuild/win32-ia32': 0.25.5
'@esbuild/win32-x64': 0.25.5
fsevents@2.3.3:
optional: true
get-tsconfig@4.10.1:
dependencies:
resolve-pkg-maps: 1.0.0
openai@5.8.2: {}
resolve-pkg-maps@1.0.0: {}
tsx@4.20.3:
dependencies:
esbuild: 0.25.5
get-tsconfig: 4.10.1
optionalDependencies:
fsevents: 2.3.3
typescript@5.8.3: {}
undici-types@6.21.0: {}

View File

@@ -0,0 +1,63 @@
import type { Computer } from "@trycua/computer";
import type OpenAI from "openai";
export async function executeAction(
computer: Computer,
action: OpenAI.Responses.ResponseComputerToolCall["action"],
) {
switch (action.type) {
case "click": {
const { x, y, button } = action;
console.log(`Executing click at (${x}, ${y}) with button '${button}'.`);
await computer.interface.moveCursor(x, y);
if (button === "right") await computer.interface.rightClick();
else await computer.interface.leftClick();
break;
}
case "type":
{
const { text } = action;
console.log(`Typing text: ${text}`);
await computer.interface.typeText(text);
}
break;
case "scroll": {
const { x: locX, y: locY, scroll_x, scroll_y } = action;
console.log(
`Scrolling at (${locX}, ${locY}) with offsets (scroll_x=${scroll_x}, scroll_y=${scroll_y}).`,
);
await computer.interface.moveCursor(locX, locY);
await computer.interface.scroll(scroll_x, scroll_y);
break;
}
case "keypress": {
const { keys } = action;
for (const key of keys) {
console.log(`Pressing key: ${key}.`);
// Map common key names to CUA equivalents
if (key.toLowerCase() === "enter") {
await computer.interface.pressKey("return");
} else if (key.toLowerCase() === "space") {
await computer.interface.pressKey("space");
} else {
await computer.interface.pressKey(key);
}
}
break;
}
case "wait": {
console.log(`Waiting for 3 seconds.`);
await new Promise((resolve) => setTimeout(resolve, 3 * 1000));
break;
}
case "screenshot": {
console.log("Taking screenshot.");
// This is handled automatically in the main loop, but we can take an extra one if requested
const screenshot = await computer.interface.screenshot();
return screenshot;
}
default:
console.log(`Unrecognized action: ${action.type}`);
break;
}
}

View File

@@ -0,0 +1,104 @@
import { Computer, OSType } from "@trycua/computer";
import OpenAI from "openai";
import { executeAction } from "./helpers";
import "dotenv/config";
const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY });
const COMPUTER_USE_PROMPT = "Open firefox and go to trycua.com";
// Initialize the Computer Connection
const computer = new Computer({
apiKey: process.env.CUA_KEY!,
name: process.env.CUA_CONTAINER_NAME!,
osType: OSType.LINUX,
});
await computer.run();
// Take the initial screenshot
const screenshot = await computer.interface.screenshot();
const screenshotBase64 = screenshot.toString("base64");
// Setup openai config for computer use
const computerUseConfig: OpenAI.Responses.ResponseCreateParamsNonStreaming = {
model: "computer-use-preview",
tools: [
{
type: "computer_use_preview",
display_width: 1024,
display_height: 768,
environment: "linux", // we're using a linux vm
},
],
truncation: "auto",
};
// Send initial screenshot to the openai computer use model
let res = await openai.responses.create({
...computerUseConfig,
input: [
{
role: "user",
content: [
// what we want the ai to do
{ type: "input_text", text: COMPUTER_USE_PROMPT },
// current screenshot of the vm
{
type: "input_image",
image_url: `data:image/png;base64,${screenshotBase64}`,
detail: "auto",
},
],
},
],
});
// Loop until there are no more computer use actions.
while (true) {
const computerCalls = res.output.filter((o) => o.type === "computer_call");
if (computerCalls.length < 1) {
console.log("No more computer calls. Loop complete.");
break;
}
// Get the first call
const call = computerCalls[0];
const action = call.action;
console.log("Received action from OpenAI Responses API:", action);
let ackChecks: OpenAI.Responses.ResponseComputerToolCall.PendingSafetyCheck[] =
[];
if (call.pending_safety_checks.length > 0) {
console.log("Safety checks pending:", call.pending_safety_checks);
// In a real implementation, you would want to get user confirmation here
ackChecks = call.pending_safety_checks;
}
// Execute the action in the container
await executeAction(computer, action);
// Wait for changes to process within the container (1sec)
await new Promise((resolve) => setTimeout(resolve, 1000));
// Capture new screenshot
const newScreenshot = await computer.interface.screenshot();
const newScreenshotBase64 = newScreenshot.toString("base64");
// Screenshot back as computer_call_output
res = await openai.responses.create({
...computerUseConfig,
previous_response_id: res.id,
input: [
{
type: "computer_call_output",
call_id: call.call_id,
acknowledged_safety_checks: ackChecks,
output: {
type: "computer_screenshot",
image_url: `data:image/png;base64,${newScreenshotBase64}`,
},
},
],
});
}
process.exit();

View File

@@ -2,8 +2,8 @@
This repository contains TypeScript implementations of the C/UA libraries:
- `@cua/core`: Core functionality including telemetry and logging
- `@cua/computer`: Computer interaction SDK for VM management and control
- `@trycua/core`: Core functionality including telemetry and logging
- `@trycua/computer`: Computer interaction SDK for VM management and control
## Project Structure
@@ -48,10 +48,10 @@ Build specific packages:
```bash
# Build core package
pnpm --filter @cua/core build
pnpm --filter @trycua/core build
# Build computer package
pnpm --filter @cua/computer build
pnpm --filter @trycua/computer build
```
### Running Tests
@@ -66,10 +66,10 @@ Run tests for specific packages:
```bash
# Test core package
pnpm --filter @cua/core test
pnpm --filter @trycua/core test
# Test computer package
pnpm --filter @cua/computer test
pnpm --filter @trycua/computer test
```
### Linting
@@ -88,14 +88,14 @@ pnpm lint:fix:all
## Package Details
### @cua/core
### @trycua/core
Core functionality for C/UA libraries including:
- Telemetry with PostHog integration
- Common utilities and types
### @cua/computer
### @trycua/computer
Computer interaction SDK for managing and controlling virtual machines:

View File

@@ -9,15 +9,15 @@ This library is a TypeScript port of the Python computer library, providing the
## Installation
```bash
npm install @cua/computer
npm install @trycua/computer
# or
pnpm add @cua/computer
pnpm add @trycua/computer
```
## Usage
```typescript
import { Computer } from '@cua/computer';
import { Computer } from '@trycua/computer';
// Create a new computer instance
const computer = new Computer({

View File

@@ -1,5 +1,5 @@
{
"name": "@cua/computer",
"name": "@trycua/computer",
"version": "0.0.1",
"packageManager": "pnpm@10.11.0",
"description": "Typescript SDK for c/ua computer interaction",
@@ -38,7 +38,7 @@
"prepublishOnly": "pnpm run build"
},
"dependencies": {
"@cua/core": "link:../core",
"@trycua/core": "link:../core",
"pino": "^9.7.0",
"ws": "^8.18.0"
},

View File

@@ -1,117 +1,117 @@
import os from 'node:os';
import { Telemetry } from '@cua/core';
import pino from 'pino';
import type { OSType } from '../../types';
import type { BaseComputerConfig, Display, VMProviderType } from '../types';
import os from "node:os";
import { Telemetry } from "@trycua/core";
import pino from "pino";
import type { OSType } from "../../types";
import type { BaseComputerConfig, Display, VMProviderType } from "../types";
const logger = pino({ name: 'computer.provider_base' });
const logger = pino({ name: "computer.provider_base" });
/**
* Base Computer class with shared functionality
*/
export abstract class BaseComputer {
protected name: string;
protected osType: OSType;
protected vmProvider?: VMProviderType;
protected telemetry: Telemetry;
protected name: string;
protected osType: OSType;
protected vmProvider?: VMProviderType;
protected telemetry: Telemetry;
constructor(config: BaseComputerConfig) {
this.name = config.name;
this.osType = config.osType;
this.telemetry = new Telemetry();
this.telemetry.recordEvent('module_init', {
module: 'computer',
version: process.env.npm_package_version,
node_version: process.version,
});
constructor(config: BaseComputerConfig) {
this.name = config.name;
this.osType = config.osType;
this.telemetry = new Telemetry();
this.telemetry.recordEvent("module_init", {
module: "computer",
version: process.env.npm_package_version,
node_version: process.version,
});
this.telemetry.recordEvent('computer_initialized', {
os: os.platform(),
os_version: os.version(),
node_version: process.version,
});
}
this.telemetry.recordEvent("computer_initialized", {
os: os.platform(),
os_version: os.version(),
node_version: process.version,
});
}
/**
* Get the name of the computer
*/
getName(): string {
return this.name;
}
/**
* Get the name of the computer
*/
getName(): string {
return this.name;
}
/**
* Get the OS type of the computer
*/
getOSType(): OSType {
return this.osType;
}
/**
* Get the OS type of the computer
*/
getOSType(): OSType {
return this.osType;
}
/**
* Get the VM provider type
*/
getVMProviderType(): VMProviderType | undefined {
return this.vmProvider;
}
/**
* Get the VM provider type
*/
getVMProviderType(): VMProviderType | undefined {
return this.vmProvider;
}
/**
* Shared method available to all computer types
*/
async disconnect(): Promise<void> {
logger.info(`Disconnecting from ${this.name}`);
// Implementation would go here
}
/**
* Shared method available to all computer types
*/
async disconnect(): Promise<void> {
logger.info(`Disconnecting from ${this.name}`);
// Implementation would go here
}
/**
* Parse display string into Display object
* @param display Display string in format "WIDTHxHEIGHT"
* @returns Display object
*/
public static parseDisplayString(display: string): Display {
const match = display.match(/^(\d+)x(\d+)$/);
if (!match) {
throw new Error(
`Invalid display format: ${display}. Expected format: WIDTHxHEIGHT`
);
}
/**
* Parse display string into Display object
* @param display Display string in format "WIDTHxHEIGHT"
* @returns Display object
*/
public static parseDisplayString(display: string): Display {
const match = display.match(/^(\d+)x(\d+)$/);
if (!match) {
throw new Error(
`Invalid display format: ${display}. Expected format: WIDTHxHEIGHT`,
);
}
return {
width: Number.parseInt(match[1], 10),
height: Number.parseInt(match[2], 10),
};
}
return {
width: Number.parseInt(match[1], 10),
height: Number.parseInt(match[2], 10),
};
}
/**
* Parse memory string to MB integer.
*
* Examples:
* "8GB" -> 8192
* "1024MB" -> 1024
* "512" -> 512
*
* @param memoryStr - Memory string to parse
* @returns Memory value in MB
*/
public static parseMemoryString(memoryStr: string): number {
if (!memoryStr) {
return 0;
}
/**
* Parse memory string to MB integer.
*
* Examples:
* "8GB" -> 8192
* "1024MB" -> 1024
* "512" -> 512
*
* @param memoryStr - Memory string to parse
* @returns Memory value in MB
*/
public static parseMemoryString(memoryStr: string): number {
if (!memoryStr) {
return 0;
}
// Convert to uppercase for case-insensitive matching
const upperStr = memoryStr.toUpperCase().trim();
// Convert to uppercase for case-insensitive matching
const upperStr = memoryStr.toUpperCase().trim();
// Extract numeric value and unit
const match = upperStr.match(/^(\d+(?:\.\d+)?)\s*(GB|MB)?$/);
if (!match) {
throw new Error(`Invalid memory format: ${memoryStr}`);
}
// Extract numeric value and unit
const match = upperStr.match(/^(\d+(?:\.\d+)?)\s*(GB|MB)?$/);
if (!match) {
throw new Error(`Invalid memory format: ${memoryStr}`);
}
const value = Number.parseFloat(match[1]);
const unit = match[2] || 'MB'; // Default to MB if no unit specified
const value = Number.parseFloat(match[1]);
const unit = match[2] || "MB"; // Default to MB if no unit specified
// Convert to MB
if (unit === 'GB') {
return Math.round(value * 1024);
}
return Math.round(value);
}
// Convert to MB
if (unit === "GB") {
return Math.round(value * 1024);
}
return Math.round(value);
}
}

View File

@@ -1,5 +1,5 @@
{
"name": "@cua/core",
"name": "@trycua/core",
"version": "0.0.1",
"packageManager": "pnpm@10.11.0",
"description": "Typescript SDK for c/ua core",

View File

@@ -1,56 +0,0 @@
import { Computer } from "@cua/computer";
import OpenAI from "openai";
export async function executeAction(
computer: Computer,
action: OpenAI.Responses.ResponseComputerToolCall['action']
) {
switch (action.type) {
case 'click':
const { x, y, button } = action;
console.log(`Executing click at (${x}, ${y}) with button '${button}'.`);
await computer.interface.moveCursor(x, y);
if (button === 'right') await computer.interface.rightClick();
else await computer.interface.leftClick();
break;
case 'type':
const { text } = action;
console.log(`Typing text: ${text}`);
await computer.interface.typeText(text);
break;
case 'scroll':
const { x: locX, y: locY, scroll_x, scroll_y } = action;
console.log(
`Scrolling at (${locX}, ${locY}) with offsets (scroll_x=${scroll_x}, scroll_y=${scroll_y}).`
);
await computer.interface.moveCursor(locX, locY);
await computer.interface.scroll(scroll_x, scroll_y);
break;
case 'keypress':
const { keys } = action;
for (const key of keys) {
console.log(`Pressing key: ${key}.`);
// Map common key names to CUA equivalents
if (key.toLowerCase() === 'enter') {
await computer.interface.pressKey('return');
} else if (key.toLowerCase() === 'space') {
await computer.interface.pressKey('space');
} else {
await computer.interface.pressKey(key);
}
}
break;
case 'wait':
console.log(`Waiting for 3 seconds.`);
await new Promise((resolve) => setTimeout(resolve, 3 * 1000));
break;
case 'screenshot':
console.log('Taking screenshot.');
// This is handled automatically in the main loop, but we can take an extra one if requested
const screenshot = await computer.interface.screenshot();
return screenshot;
default:
console.log(`Unrecognized action: ${action.type}`);
break;
}
}

View File

@@ -1,104 +0,0 @@
import { Computer, OSType } from '@cua/computer';
import OpenAI from 'openai';
import { executeAction } from './helpers';
import 'dotenv/config';
const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY });
const COMPUTER_USE_PROMPT = 'Open firefox and go to trycua.com';
// Initialize the Computer Connection
const computer = new Computer({
apiKey: process.env.CUA_KEY!,
name: process.env.CUA_CONTAINER_NAME!,
osType: OSType.LINUX,
});
await computer.run();
// Take the initial screenshot
const screenshot = await computer.interface.screenshot();
const screenshotBase64 = screenshot.toString('base64');
// Setup openai config for computer use
const computerUseConfig: OpenAI.Responses.ResponseCreateParamsNonStreaming = {
model: 'computer-use-preview',
tools: [
{
type: 'computer_use_preview',
display_width: 1024,
display_height: 768,
environment: 'linux', // we're using a linux vm
},
],
truncation: 'auto',
};
// Send initial screenshot to the openai computer use model
let res = await openai.responses.create({
...computerUseConfig,
input: [
{
role: 'user',
content: [
// what we want the ai to do
{ type: 'input_text', text: COMPUTER_USE_PROMPT },
// current screenshot of the vm
{
type: 'input_image',
image_url: `data:image/png;base64,${screenshotBase64}`,
detail: 'auto',
},
],
},
],
});
// Loop until there are no more computer use actions.
while (true) {
const computerCalls = res.output.filter((o) => o.type === 'computer_call');
if (computerCalls.length < 1) {
console.log('No more computer calls. Loop complete.');
break;
}
// Get the first call
const call = computerCalls[0];
const action = call.action;
console.log('Received action from OpenAI Responses API:', action);
let ackChecks: OpenAI.Responses.ResponseComputerToolCall.PendingSafetyCheck[] =
[];
if (call.pending_safety_checks.length > 0) {
console.log('Safety checks pending:', call.pending_safety_checks);
// In a real implementation, you would want to get user confirmation here
ackChecks = call.pending_safety_checks;
}
// Execute the action in the container
await executeAction(computer, action);
// Wait for changes to process within the container (1sec)
await new Promise((resolve) => setTimeout(resolve, 1000));
// Capture new screenshot
const newScreenshot = await computer.interface.screenshot();
const newScreenshotBase64 = newScreenshot.toString('base64');
// Screenshot back as computer_call_output
res = await openai.responses.create({
...computerUseConfig,
previous_response_id: res.id,
input: [
{
type: 'computer_call_output',
call_id: call.call_id,
acknowledged_safety_checks: ackChecks,
output: {
type: 'computer_screenshot',
image_url: `data:image/png;base64,${newScreenshotBase64}`,
},
},
],
});
}
process.exit();

View File

@@ -8,11 +8,11 @@
"scripts": {
"lint": "biome check",
"lint:fix": "biome check --fix",
"build:core": "pnpm --filter @cua/core build",
"build:computer": "pnpm --filter @cua/computer build",
"build:core": "pnpm --filter @trycua/core build",
"build:computer": "pnpm --filter @trycua/computer build",
"build": "pnpm build:core && pnpm build:computer",
"test:core": "pnpm --filter @cua/core test",
"test:computer": "pnpm --filter @cua/computer test",
"test:core": "pnpm --filter @trycua/core test",
"test:computer": "pnpm --filter @trycua/computer test",
"test": "pnpm -r test",
"typecheck": "pnpm -r typecheck"
},

View File

@@ -14,7 +14,7 @@ importers:
computer:
dependencies:
'@cua/core':
'@trycua/core':
specifier: link:../core
version: link:../core
pino:
@@ -22,14 +22,14 @@ importers:
version: 9.7.0
ws:
specifier: ^8.18.0
version: 8.18.2
version: 8.18.3
devDependencies:
'@biomejs/biome':
specifier: ^1.9.4
version: 1.9.4
'@types/node':
specifier: ^22.15.17
version: 22.15.33
version: 22.15.34
'@types/ws':
specifier: ^8.18.1
version: 8.18.1
@@ -50,7 +50,7 @@ importers:
version: 5.8.3
vitest:
specifier: ^3.1.3
version: 3.2.4(@types/node@22.15.33)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
version: 3.2.4(@types/node@22.15.34)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
core:
dependencies:
@@ -72,7 +72,7 @@ importers:
version: 1.9.4
'@types/node':
specifier: ^22.15.17
version: 22.15.33
version: 22.15.34
'@types/ws':
specifier: ^8.18.1
version: 8.18.1
@@ -93,45 +93,7 @@ importers:
version: 5.8.3
vitest:
specifier: ^3.1.3
version: 3.2.4(@types/node@22.15.33)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
examples/byo-operator-ts:
dependencies:
'@cua/computer':
specifier: link:../../computer
version: link:../../computer
openai:
specifier: ^5.7.0
version: 5.7.0(ws@8.18.2)
devDependencies:
tsx:
specifier: ^4.20.3
version: 4.20.3
typescript:
specifier: ^5.8.3
version: 5.8.3
examples/cua-openai:
dependencies:
'@cua/computer':
specifier: link:../../computer
version: link:../../computer
dotenv:
specifier: ^16.5.0
version: 16.5.0
openai:
specifier: ^5.7.0
version: 5.7.0(ws@8.18.2)
devDependencies:
'@types/node':
specifier: ^22.15.33
version: 22.15.33
tsx:
specifier: ^4.20.3
version: 4.20.3
typescript:
specifier: ^5.8.3
version: 5.8.3
version: 3.2.4(@types/node@22.15.34)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
packages:
@@ -147,13 +109,13 @@ packages:
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.27.5':
resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==}
'@babel/parser@7.27.7':
resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/types@7.27.6':
resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==}
'@babel/types@7.27.7':
resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==}
engines: {node: '>=6.9.0'}
'@biomejs/biome@1.9.4':
@@ -368,23 +330,18 @@ packages:
cpu: [x64]
os: [win32]
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
'@jridgewell/gen-mapping@0.3.10':
resolution: {integrity: sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg==}
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
'@jridgewell/set-array@1.2.1':
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
'@jridgewell/sourcemap-codec@1.5.2':
resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@jridgewell/trace-mapping@0.3.27':
resolution: {integrity: sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg==}
'@napi-rs/wasm-runtime@0.2.11':
resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==}
@@ -459,103 +416,103 @@ packages:
'@rolldown/pluginutils@1.0.0-beta.9':
resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==}
'@rollup/rollup-android-arm-eabi@4.44.0':
resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==}
'@rollup/rollup-android-arm-eabi@4.44.1':
resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.44.0':
resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==}
'@rollup/rollup-android-arm64@4.44.1':
resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.44.0':
resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==}
'@rollup/rollup-darwin-arm64@4.44.1':
resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.44.0':
resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==}
'@rollup/rollup-darwin-x64@4.44.1':
resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.44.0':
resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==}
'@rollup/rollup-freebsd-arm64@4.44.1':
resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.44.0':
resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==}
'@rollup/rollup-freebsd-x64@4.44.1':
resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.44.0':
resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==}
'@rollup/rollup-linux-arm-gnueabihf@4.44.1':
resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.44.0':
resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==}
'@rollup/rollup-linux-arm-musleabihf@4.44.1':
resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.44.0':
resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==}
'@rollup/rollup-linux-arm64-gnu@4.44.1':
resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.44.0':
resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==}
'@rollup/rollup-linux-arm64-musl@4.44.1':
resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.44.0':
resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==}
'@rollup/rollup-linux-loongarch64-gnu@4.44.1':
resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-powerpc64le-gnu@4.44.0':
resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==}
'@rollup/rollup-linux-powerpc64le-gnu@4.44.1':
resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.44.0':
resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==}
'@rollup/rollup-linux-riscv64-gnu@4.44.1':
resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.44.0':
resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==}
'@rollup/rollup-linux-riscv64-musl@4.44.1':
resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.44.0':
resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==}
'@rollup/rollup-linux-s390x-gnu@4.44.1':
resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.44.0':
resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==}
'@rollup/rollup-linux-x64-gnu@4.44.1':
resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.44.0':
resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==}
'@rollup/rollup-linux-x64-musl@4.44.1':
resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==}
cpu: [x64]
os: [linux]
'@rollup/rollup-win32-arm64-msvc@4.44.0':
resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==}
'@rollup/rollup-win32-arm64-msvc@4.44.1':
resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.44.0':
resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==}
'@rollup/rollup-win32-ia32-msvc@4.44.1':
resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.44.0':
resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==}
'@rollup/rollup-win32-x64-msvc@4.44.1':
resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==}
cpu: [x64]
os: [win32]
@@ -571,8 +528,8 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/node@22.15.33':
resolution: {integrity: sha512-wzoocdnnpSxZ+6CjW4ADCK1jVmd1S/J3ArNWfn8FDDQtRm8dkDg7TA+mvek2wNrfCgwuZxqEOiB9B1XCJ6+dbw==}
'@types/node@22.15.34':
resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==}
'@types/uuid@10.0.0':
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
@@ -693,8 +650,8 @@ packages:
resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==}
engines: {node: '>=0.3.1'}
dotenv@16.5.0:
resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
dotenv@16.6.1:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
dts-resolver@2.1.1:
@@ -807,18 +764,6 @@ packages:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
openai@5.7.0:
resolution: {integrity: sha512-zXWawZl6J/P5Wz57/nKzVT3kJQZvogfuyuNVCdEp4/XU2UNrjL7SsuNpWAyLZbo6HVymwmnfno9toVzBhelygA==}
hasBin: true
peerDependencies:
ws: ^8.18.0
zod: ^3.23.8
peerDependenciesMeta:
ws:
optional: true
zod:
optional: true
package-manager-detector@1.3.0:
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
@@ -849,8 +794,8 @@ packages:
resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==}
hasBin: true
pkg-types@2.1.0:
resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
pkg-types@2.1.1:
resolution: {integrity: sha512-eY0QFb6eSwc9+0d/5D2lFFUq+A3n3QNGSy/X2Nvp+6MfzGw2u6EbA7S80actgjY1lkvvI0pqB+a4hioMh443Ew==}
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
@@ -883,8 +828,8 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
rolldown-plugin-dts@0.13.12:
resolution: {integrity: sha512-4QdQQfMOWNDLhmvoG3USAUpCm75dgwWk3IrK6SV9Fw2U5uwcSE7oQTqEcmsUGEBsNxZ58+gtM1oX38MMf0g5PA==}
rolldown-plugin-dts@0.13.13:
resolution: {integrity: sha512-Nchx9nQoa4IpfQ/BJzodKMvtJ3H3dT322siAJSp3uvQJ+Pi1qgEjOp7hSQwGSQRhaC5gC+9hparbWEH5oiAL9Q==}
engines: {node: '>=20.18.0'}
peerDependencies:
'@typescript/native-preview': '>=7.0.0-dev.20250601.1'
@@ -908,8 +853,8 @@ packages:
'@oxc-project/runtime':
optional: true
rollup@4.44.0:
resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==}
rollup@4.44.1:
resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -1101,8 +1046,8 @@ packages:
engines: {node: '>=8'}
hasBin: true
ws@8.18.2:
resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
ws@8.18.3:
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -1122,21 +1067,21 @@ snapshots:
'@babel/generator@7.27.5':
dependencies:
'@babel/parser': 7.27.5
'@babel/types': 7.27.6
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@babel/parser': 7.27.7
'@babel/types': 7.27.7
'@jridgewell/gen-mapping': 0.3.10
'@jridgewell/trace-mapping': 0.3.27
jsesc: 3.1.0
'@babel/helper-string-parser@7.27.1': {}
'@babel/helper-validator-identifier@7.27.1': {}
'@babel/parser@7.27.5':
'@babel/parser@7.27.7':
dependencies:
'@babel/types': 7.27.6
'@babel/types': 7.27.7
'@babel/types@7.27.6':
'@babel/types@7.27.7':
dependencies:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
@@ -1267,22 +1212,19 @@ snapshots:
'@esbuild/win32-x64@0.25.5':
optional: true
'@jridgewell/gen-mapping@0.3.8':
'@jridgewell/gen-mapping@0.3.10':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/sourcemap-codec': 1.5.2
'@jridgewell/trace-mapping': 0.3.27
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
'@jridgewell/sourcemap-codec@1.5.2': {}
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
'@jridgewell/trace-mapping@0.3.27':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/sourcemap-codec': 1.5.2
'@napi-rs/wasm-runtime@0.2.11':
dependencies:
@@ -1337,64 +1279,64 @@ snapshots:
'@rolldown/pluginutils@1.0.0-beta.9': {}
'@rollup/rollup-android-arm-eabi@4.44.0':
'@rollup/rollup-android-arm-eabi@4.44.1':
optional: true
'@rollup/rollup-android-arm64@4.44.0':
'@rollup/rollup-android-arm64@4.44.1':
optional: true
'@rollup/rollup-darwin-arm64@4.44.0':
'@rollup/rollup-darwin-arm64@4.44.1':
optional: true
'@rollup/rollup-darwin-x64@4.44.0':
'@rollup/rollup-darwin-x64@4.44.1':
optional: true
'@rollup/rollup-freebsd-arm64@4.44.0':
'@rollup/rollup-freebsd-arm64@4.44.1':
optional: true
'@rollup/rollup-freebsd-x64@4.44.0':
'@rollup/rollup-freebsd-x64@4.44.1':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.44.0':
'@rollup/rollup-linux-arm-gnueabihf@4.44.1':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.44.0':
'@rollup/rollup-linux-arm-musleabihf@4.44.1':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.44.0':
'@rollup/rollup-linux-arm64-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-arm64-musl@4.44.0':
'@rollup/rollup-linux-arm64-musl@4.44.1':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.44.0':
'@rollup/rollup-linux-loongarch64-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.44.0':
'@rollup/rollup-linux-powerpc64le-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.44.0':
'@rollup/rollup-linux-riscv64-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.44.0':
'@rollup/rollup-linux-riscv64-musl@4.44.1':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.44.0':
'@rollup/rollup-linux-s390x-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-x64-gnu@4.44.0':
'@rollup/rollup-linux-x64-gnu@4.44.1':
optional: true
'@rollup/rollup-linux-x64-musl@4.44.0':
'@rollup/rollup-linux-x64-musl@4.44.1':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.44.0':
'@rollup/rollup-win32-arm64-msvc@4.44.1':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.44.0':
'@rollup/rollup-win32-ia32-msvc@4.44.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.44.0':
'@rollup/rollup-win32-x64-msvc@4.44.1':
optional: true
'@tybys/wasm-util@0.9.0':
@@ -1410,7 +1352,7 @@ snapshots:
'@types/estree@1.0.8': {}
'@types/node@22.15.33':
'@types/node@22.15.34':
dependencies:
undici-types: 6.21.0
@@ -1418,7 +1360,7 @@ snapshots:
'@types/ws@8.18.1':
dependencies:
'@types/node': 22.15.33
'@types/node': 22.15.34
'@vitest/expect@3.2.4':
dependencies:
@@ -1428,13 +1370,13 @@ snapshots:
chai: 5.2.0
tinyrainbow: 2.0.0
'@vitest/mocker@3.2.4(vite@7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0))':
'@vitest/mocker@3.2.4(vite@7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
vite: 7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -1470,7 +1412,7 @@ snapshots:
ast-kit@2.1.0:
dependencies:
'@babel/parser': 7.27.5
'@babel/parser': 7.27.7
pathe: 2.0.3
atomic-sleep@1.0.0: {}
@@ -1498,14 +1440,14 @@ snapshots:
chokidar: 4.0.3
confbox: 0.2.2
defu: 6.1.4
dotenv: 16.5.0
dotenv: 16.6.1
exsolve: 1.0.7
giget: 2.0.0
jiti: 2.4.2
ohash: 2.0.11
pathe: 2.0.3
perfect-debounce: 1.0.0
pkg-types: 2.1.0
pkg-types: 2.1.1
rc9: 2.1.2
cac@6.7.14: {}
@@ -1544,7 +1486,7 @@ snapshots:
diff@8.0.2: {}
dotenv@16.5.0: {}
dotenv@16.6.1: {}
dts-resolver@2.1.1: {}
@@ -1631,7 +1573,7 @@ snapshots:
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/sourcemap-codec': 1.5.2
ms@2.1.3: {}
@@ -1644,17 +1586,13 @@ snapshots:
citty: 0.1.6
consola: 3.4.2
pathe: 2.0.3
pkg-types: 2.1.0
pkg-types: 2.1.1
tinyexec: 0.3.2
ohash@2.0.11: {}
on-exit-leak-free@2.1.2: {}
openai@5.7.0(ws@8.18.2):
optionalDependencies:
ws: 8.18.2
package-manager-detector@1.3.0: {}
pathe@2.0.3: {}
@@ -1687,7 +1625,7 @@ snapshots:
sonic-boom: 4.2.0
thread-stream: 3.1.0
pkg-types@2.1.0:
pkg-types@2.1.1:
dependencies:
confbox: 0.2.2
exsolve: 1.0.7
@@ -1718,11 +1656,11 @@ snapshots:
resolve-pkg-maps@1.0.0: {}
rolldown-plugin-dts@0.13.12(rolldown@1.0.0-beta.9)(typescript@5.8.3):
rolldown-plugin-dts@0.13.13(rolldown@1.0.0-beta.9)(typescript@5.8.3):
dependencies:
'@babel/generator': 7.27.5
'@babel/parser': 7.27.5
'@babel/types': 7.27.6
'@babel/parser': 7.27.7
'@babel/types': 7.27.7
ast-kit: 2.1.0
birpc: 2.4.0
debug: 4.4.1
@@ -1754,30 +1692,30 @@ snapshots:
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.9
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.9
rollup@4.44.0:
rollup@4.44.1:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.44.0
'@rollup/rollup-android-arm64': 4.44.0
'@rollup/rollup-darwin-arm64': 4.44.0
'@rollup/rollup-darwin-x64': 4.44.0
'@rollup/rollup-freebsd-arm64': 4.44.0
'@rollup/rollup-freebsd-x64': 4.44.0
'@rollup/rollup-linux-arm-gnueabihf': 4.44.0
'@rollup/rollup-linux-arm-musleabihf': 4.44.0
'@rollup/rollup-linux-arm64-gnu': 4.44.0
'@rollup/rollup-linux-arm64-musl': 4.44.0
'@rollup/rollup-linux-loongarch64-gnu': 4.44.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.44.0
'@rollup/rollup-linux-riscv64-gnu': 4.44.0
'@rollup/rollup-linux-riscv64-musl': 4.44.0
'@rollup/rollup-linux-s390x-gnu': 4.44.0
'@rollup/rollup-linux-x64-gnu': 4.44.0
'@rollup/rollup-linux-x64-musl': 4.44.0
'@rollup/rollup-win32-arm64-msvc': 4.44.0
'@rollup/rollup-win32-ia32-msvc': 4.44.0
'@rollup/rollup-win32-x64-msvc': 4.44.0
'@rollup/rollup-android-arm-eabi': 4.44.1
'@rollup/rollup-android-arm64': 4.44.1
'@rollup/rollup-darwin-arm64': 4.44.1
'@rollup/rollup-darwin-x64': 4.44.1
'@rollup/rollup-freebsd-arm64': 4.44.1
'@rollup/rollup-freebsd-x64': 4.44.1
'@rollup/rollup-linux-arm-gnueabihf': 4.44.1
'@rollup/rollup-linux-arm-musleabihf': 4.44.1
'@rollup/rollup-linux-arm64-gnu': 4.44.1
'@rollup/rollup-linux-arm64-musl': 4.44.1
'@rollup/rollup-linux-loongarch64-gnu': 4.44.1
'@rollup/rollup-linux-powerpc64le-gnu': 4.44.1
'@rollup/rollup-linux-riscv64-gnu': 4.44.1
'@rollup/rollup-linux-riscv64-musl': 4.44.1
'@rollup/rollup-linux-s390x-gnu': 4.44.1
'@rollup/rollup-linux-x64-gnu': 4.44.1
'@rollup/rollup-linux-x64-musl': 4.44.1
'@rollup/rollup-win32-arm64-msvc': 4.44.1
'@rollup/rollup-win32-ia32-msvc': 4.44.1
'@rollup/rollup-win32-x64-msvc': 4.44.1
fsevents: 2.3.3
safe-stable-stringify@2.5.0: {}
@@ -1833,7 +1771,7 @@ snapshots:
empathic: 1.1.0
hookable: 5.5.3
rolldown: 1.0.0-beta.9
rolldown-plugin-dts: 0.13.12(rolldown@1.0.0-beta.9)(typescript@5.8.3)
rolldown-plugin-dts: 0.13.13(rolldown@1.0.0-beta.9)(typescript@5.8.3)
semver: 7.7.2
tinyexec: 1.0.1
tinyglobby: 0.2.14
@@ -1870,13 +1808,13 @@ snapshots:
uuid@11.1.0: {}
vite-node@3.2.4(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
vite-node@3.2.4(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
cac: 6.7.14
debug: 4.4.1
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@types/node'
- jiti
@@ -1891,26 +1829,26 @@ snapshots:
- tsx
- yaml
vite@7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
vite@7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
esbuild: 0.25.5
fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
postcss: 8.5.6
rollup: 4.44.0
rollup: 4.44.1
tinyglobby: 0.2.14
optionalDependencies:
'@types/node': 22.15.33
'@types/node': 22.15.34
fsevents: 2.3.3
jiti: 2.4.2
tsx: 4.20.3
yaml: 2.8.0
vitest@3.2.4(@types/node@22.15.33)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
vitest@3.2.4(@types/node@22.15.34)(happy-dom@17.6.3)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0))
'@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -1928,11 +1866,11 @@ snapshots:
tinyglobby: 0.2.14
tinypool: 1.1.1
tinyrainbow: 2.0.0
vite: 7.0.0(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
vite-node: 3.2.4(@types/node@22.15.33)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.0(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
vite-node: 3.2.4(@types/node@22.15.34)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.15.33
'@types/node': 22.15.34
happy-dom: 17.6.3
transitivePeerDependencies:
- jiti
@@ -1957,6 +1895,6 @@ snapshots:
siginfo: 2.0.0
stackback: 0.0.2
ws@8.18.2: {}
ws@8.18.3: {}
yaml@2.8.0: {}