diff --git a/.gitattributes b/.gitattributes index c306817fcc..f55b400527 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ +app/aws-lsp-codewhisperer-runtimes/_bundle-assets/**/*.zip filter=lfs diff=lfs merge=lfs -text binaries/*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/agentic-prerelease-release-notes.md b/.github/workflows/agentic-prerelease-release-notes.md new file mode 100644 index 0000000000..b29f3938ab --- /dev/null +++ b/.github/workflows/agentic-prerelease-release-notes.md @@ -0,0 +1,19 @@ +This is an **unsupported preview build** of agentic chat for the `${BRANCH}` branch. + +Commit ID: `${COMMIT_ID}` +Git Tag: `${TAG_NAME}` +Version: `${SERVER_VERSION}` + +## Installation + +Depending on your IDE plugin, you may have the following options available to you + +### Sideload a build into the plugin +Download the bundle, then configure your plugin to use the downloaded build. +- download clients.zip, and unzip it to a `clients` folder +- download the servers zip for your platform, and unzip it to a `servers` folder +- configure your plugin to use your downloaded client and server + +### Override the artifact manifest +Configure your plugin to download and install the build linked to this release. +- Override your plugin's manifest url to use ${MANIFEST_URL} diff --git a/.github/workflows/create-agent-standalone.yml b/.github/workflows/create-agent-standalone.yml new file mode 100644 index 0000000000..2807a50aea --- /dev/null +++ b/.github/workflows/create-agent-standalone.yml @@ -0,0 +1,101 @@ +name: Create agent-standalone bundles + +on: + push: + branches: [main, feature/*, release/agentic/*] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + lfs: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm i + + - name: Compile project + run: npm run compile + + - name: Generate agent standalone + run: | + npm run ci:generate:agent-standalone -w app/aws-lsp-codewhisperer-runtimes + npm run ci:generate:agentic:attribution + + # We "flatten" out each clients.zip-servers.zip pairing so that the + # downloadable artifacts are nicely organized, one per platform. + - name: Prepare and upload artifacts + run: | + platforms=("linux-arm64" "linux-x64" "mac-arm64" "mac-x64" "win-x64") + for platform in "${platforms[@]}"; do + echo "Preparing artifacts for $platform" + mkdir -p "_artifacts/$platform" + + cp "app/aws-lsp-codewhisperer-runtimes/build/archives/shared/clients.zip" "_artifacts/$platform/" + cp "app/aws-lsp-codewhisperer-runtimes/build/archives/agent-standalone/$platform/servers.zip" "_artifacts/$platform/" + done + mkdir -p "_artifacts/clients" + unzip "app/aws-lsp-codewhisperer-runtimes/build/archives/shared/clients.zip" -d _artifacts/clients + + # GitHub Actions zips the archive, so we upload the folder used to + # produce clients.zip. Otherwise we have a clients.zip artifact + # that contains our clients.zip file. + # app/aws-lsp-codewhisperer-runtimes/build/archives/shared/clients.zip + - name: Upload clients.zip + uses: actions/upload-artifact@v4 + with: + name: clients + path: _artifacts/clients/ + if-no-files-found: error + + - name: Upload linux-arm64 + uses: actions/upload-artifact@v4 + with: + name: linux-arm64 + path: _artifacts/linux-arm64/ + if-no-files-found: error + + - name: Upload linux-x64 + uses: actions/upload-artifact@v4 + with: + name: linux-x64 + path: _artifacts/linux-x64/ + if-no-files-found: error + + - name: Upload mac-arm64 + uses: actions/upload-artifact@v4 + with: + name: mac-arm64 + path: _artifacts/mac-arm64/ + if-no-files-found: error + + - name: Upload mac-x64 + uses: actions/upload-artifact@v4 + with: + name: mac-x64 + path: _artifacts/mac-x64/ + if-no-files-found: error + + - name: Upload win-x64 + uses: actions/upload-artifact@v4 + with: + name: win-x64 + path: _artifacts/win-x64/ + if-no-files-found: error + + - name: Upload THIRD_PARTY_LICENSES + uses: actions/upload-artifact@v4 + with: + name: THIRD_PARTY_LICENSES + path: attribution/THIRD_PARTY_LICENSES + if-no-files-found: error diff --git a/.github/workflows/create-agentic-github-prerelease.yml b/.github/workflows/create-agentic-github-prerelease.yml new file mode 100644 index 0000000000..e5f98178dc --- /dev/null +++ b/.github/workflows/create-agentic-github-prerelease.yml @@ -0,0 +1,167 @@ +name: Create GitHub Prerelease - Agentic Chat + +permissions: + actions: read + contents: read + +on: + workflow_run: + workflows: [Create agent-standalone bundles] + types: + - completed + branches: [main, feature/*, release/agentic/*] + +jobs: + setup-vars: + runs-on: ubuntu-latest + outputs: + tagname: ${{ steps.build.outputs.tagname }} + serverversion: ${{ steps.build.outputs.serverversion }} + prereleasename: ${{ steps.build.outputs.prereleasename }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_sha }} + + # if user ran this action manually + - if: github.event_name == 'workflow_dispatch' + run: | + echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV + echo "PRERELEASE_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV + + # Otherwise a push to a branch triggered this action. + # Set TAG_NAME and PRERELEASE_NAME based on branch name + - if: github.event_name != 'workflow_dispatch' + run: | + BRANCH_NAME="${{ github.event.workflow_run.head_branch }}" + if [[ "$BRANCH_NAME" == "main" ]]; then + echo "TAG_NAME=agentic-alpha" >> $GITHUB_ENV + echo "PRERELEASE_NAME=alpha" >> $GITHUB_ENV + elif [[ "$BRANCH_NAME" == feature/* ]]; then + REMAINDER=$(echo "$BRANCH_NAME" | sed 's/^feature\///') + echo "TAG_NAME=agentic-pre-$REMAINDER" >> $GITHUB_ENV + echo "PRERELEASE_NAME=$REMAINDER" >> $GITHUB_ENV + elif [[ "$BRANCH_NAME" == release/agentic/* ]]; then + REMAINDER=$(echo "$BRANCH_NAME" | sed 's/^release\/agentic\///') + echo "TAG_NAME=agentic-rc-$REMAINDER" >> $GITHUB_ENV + echo "PRERELEASE_NAME=rc" >> $GITHUB_ENV + else + echo "Error: creating agentic releases for this branch is not supported" + exit 1 + fi + + # Make a sever version that is "decorated" as prerelease + - name: Create SERVER_VERSION + run: | + # example: 1.0.999-pre-main.commitid + # SERVER_VERSION - we're making "imitation" manifests that are accessible + # from GitHub releases, as a convenience for plugins to easily consume + # test/development builds. The version is pulled from the agenticChat field + # in the version.json file. + + AGENTIC_VERSION=$(jq -r '.agenticChat' app/aws-lsp-codewhisperer-runtimes/src/version.json) + COMMIT_SHORT=$(echo "${{ github.event.workflow_run.head_sha }}" | cut -c1-8) + echo "SERVER_VERSION=$AGENTIC_VERSION-$PRERELEASE_NAME.$COMMIT_SHORT" >> $GITHUB_ENV + + - name: Export outputs + id: build + run: | + # tag name is the git tag that the github release is linked with + echo "tagname=$TAG_NAME" >> $GITHUB_OUTPUT + # pre-release name is the semver pre-release decorator (eg 'alpha', 'rc', ...) + echo "prereleasename=$PRERELEASE_NAME" >> $GITHUB_OUTPUT + echo "serverversion=$SERVER_VERSION" >> $GITHUB_OUTPUT + + create-release: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + needs: [setup-vars] + + env: + # + # For `gh` cli. + # + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_NAME: ${{ needs.setup-vars.outputs.tagname }} + # + # Used in release_notes.md and git tag + # + BRANCH: ${{ github.event.workflow_run.head_branch }} + COMMIT_ID: ${{ github.event.workflow_run.head_sha }} + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_sha }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + # To run a ts script to create the manifest + - name: Install dependencies + run: npm i + + # Download all the files uploaded by .github/workflows/create-agent-standalone.yml + - name: Download all platform artifacts + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + path: ./downloaded-artifacts + + # actions/download-artifact@v4 unzips all of the artifacts + # Flatten all files we want to attach to the Release into _release-artifacts/ + - name: Create Release Artifacts + run: | + mkdir -p _release-artifacts + + # servers.zip - one per platform + platforms=("linux-arm64" "linux-x64" "mac-arm64" "mac-x64" "win-x64") + for platform in "${platforms[@]}"; do + cp downloaded-artifacts/$platform/servers.zip _release-artifacts/$platform-servers.zip + done + + # clients.zip : just pick one of the platforms, they're all the same file + cp downloaded-artifacts/linux-x64/clients.zip _release-artifacts/clients.zip + + # THIRD_PARTY_LICENSES + cp downloaded-artifacts/THIRD_PARTY_LICENSES/THIRD_PARTY_LICENSES _release-artifacts/THIRD_PARTY_LICENSES + + # Manifest assigned to the GitHub release will only ever contain one version, + # which points to the assets uploaded to the release (the latest commit). + - name: Create Artifact Manifest + env: + SERVER_VERSION: ${{ needs.setup-vars.outputs.serverversion }} + RELEASE_ARTIFACTS_PATH: ${{ github.workspace }}/_release-artifacts + REPO_URL: ${{ github.server_url }}/${{ github.repository }} + + run: | + npm run ci:generate:manifest -w app/aws-lsp-codewhisperer-runtimes/ + + - name: Remove existing release + run: | + # Remove the existing release (if it exists), we (re)create it next. + gh release delete "$TAG_NAME" --cleanup-tag --yes || true + + - name: Create GitHub Release + env: + SERVER_VERSION: ${{ needs.setup-vars.outputs.serverversion }} + PRERELEASE_NAME: ${{ needs.setup-vars.outputs.prereleasename }} + # MANIFEST_URL example: + # https://github.com/aws/language-servers/releases/download/pre-main/manifest.json + MANIFEST_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ needs.setup-vars.outputs.tagname }}/manifest.json + + run: | + # Produce the text for the release description + envsubst < "$GITHUB_WORKSPACE/.github/workflows/agentic-prerelease-release-notes.md" > "$RUNNER_TEMP/release_notes.md" + + # main and feature branches create alpha builds. + # In the future, release candidate branches will create preprod builds + gh release create $TAG_NAME --prerelease --notes-file "$RUNNER_TEMP/release_notes.md" --title "Agentic Chat: $PRERELEASE_NAME ($BRANCH)" --target $COMMIT_ID _release-artifacts/* diff --git a/.github/workflows/create-release-candidate-branch.yml b/.github/workflows/create-release-candidate-branch.yml new file mode 100644 index 0000000000..aa37873d2a --- /dev/null +++ b/.github/workflows/create-release-candidate-branch.yml @@ -0,0 +1,116 @@ +name: Set up a new Release Candidate + +on: + workflow_dispatch: + inputs: + versionIncrement: + description: 'Release Version Increment' + default: 'Minor' + required: true + type: choice + options: + - Major + - Minor + - Patch + - Custom + customVersion: + description: "Custom Release Version (only used if release increment is 'Custom') - Format: 1.2.3" + default: '' + required: false + type: string + commitId: + description: 'The commit Id to produce a release candidate with' + default: '' + required: true + type: string + +jobs: + setupRcBranch: + name: Set up a Release Candidate Branch + runs-on: ubuntu-latest + + steps: + - name: Sync code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.commitId }} + # Use RELEASE_CANDIDATE_BRANCH_CREATION_PAT to ensure workflow triggering works + token: ${{ secrets.RELEASE_CANDIDATE_BRANCH_CREATION_PAT }} + persist-credentials: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Calculate Release Version + id: release-version + env: + VERSION_FILE: app/aws-lsp-codewhisperer-runtimes/src/version.json + run: | + customVersion="${{ inputs.customVersion }}" + versionIncrement="${{ inputs.versionIncrement }}" + + # Read current version + currentVersion=$(jq -r '.agenticChat' "$VERSION_FILE") + + if [[ "$versionIncrement" == "Custom" && -n "$customVersion" ]]; then + newVersion="$customVersion" + else + # Parse current version + IFS='.' read -r major minor patch <<< "$currentVersion" + + case "$versionIncrement" in + "Major") + major=$((major + 1)) + minor=0 + patch=0 + ;; + "Minor") + minor=$((minor + 1)) + patch=0 + ;; + "Patch") + patch=$((patch + 1)) + ;; + esac + + newVersion="$major.$minor.$patch" + fi + + # Update version.json + jq --arg version "$newVersion" '.agenticChat = $version' "$VERSION_FILE" > tmp.json && mv tmp.json "$VERSION_FILE" + + # Set output only + echo "RELEASE_VERSION=$newVersion" >> $GITHUB_OUTPUT + + git add "$VERSION_FILE" + + - name: Create Release Candidate Branch + id: release-branch + env: + RELEASE_VERSION: ${{ steps.release-version.outputs.RELEASE_VERSION }} + run: | + branch="release/agentic/$RELEASE_VERSION" + git checkout -b "$branch" + + # Save the branch value as output only + echo "BRANCH_NAME=$branch" >> $GITHUB_OUTPUT + + - name: Commit and Push changes + env: + BRANCH_NAME: ${{ steps.release-branch.outputs.BRANCH_NAME }} + RELEASE_VERSION: ${{ steps.release-version.outputs.RELEASE_VERSION }} + # We use the toolkit-automation account, basically something that + # isn't the default GitHub Token, because you cannot chain actions with that. + # In our case, after pushing a commit (below), we want create-agent-standalone.yml + # to start automatically. + REPO_PAT: ${{ secrets.RELEASE_CANDIDATE_BRANCH_CREATION_PAT }} + run: | + git config --global user.email "<>" + git config --global user.name "aws-toolkit-automation" + # Configure git to use the PAT token for authentication + git remote set-url origin "https://x-access-token:${REPO_PAT}@github.com/${{ github.repository }}.git" + git commit -m "Bump agentic version: $RELEASE_VERSION" + git push --set-upstream origin "$BRANCH_NAME" diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-arm64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-arm64.zip new file mode 100644 index 0000000000..24fbdb712c --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-arm64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f651f5364b2417df24d40cbd2d34d69f8b338f3f00aca9c5afd5b4f9ea3d22d +size 96647490 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-x64.zip new file mode 100644 index 0000000000..14d5e51377 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-darwin-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03ef43ac80e2a16e8c842e92a3f3285d5424f2ea99bba167b9cbb9dabb751262 +size 98328127 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-arm64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-arm64.zip new file mode 100644 index 0000000000..af6aae68c3 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-arm64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33bf50f87b67a330b3dc28f9a2fb1678f5c9cd6eb33beb964b6b068790b05b6c +size 102589811 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-x64.zip new file mode 100644 index 0000000000..4923a60a7f --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-linux-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec71aea47b7cb08c13e94fe4ca284b3656d23266bcdd728a3525abd7939730f0 +size 114552140 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-win32-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-win32-x64.zip new file mode 100644 index 0000000000..fe962b88c0 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/qserver-win32-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd8190acad1f1c2b37a818fcf606cc3d2fa4e1929c82ef967ac360b7345864b4 +size 113890248 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-arm64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-arm64.zip new file mode 100644 index 0000000000..bc380df2dc --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-arm64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29ed930601e40f565e0b9a0aa6a108e74d3582c117c7c4c494f709c9b4df5400 +size 1797214 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-x64.zip new file mode 100644 index 0000000000..186b837dbb --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-darwin-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5af3be09ec028ed8b1c39ea27016f535eca97f7824fb946c8d82ced4c21e007a +size 2093945 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-arm64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-arm64.zip new file mode 100644 index 0000000000..a90cff5167 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-arm64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57e99369471681728a193bc8c47b375891978056997ad033d2accc20b5c7f0a8 +size 2051466 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-x64.zip new file mode 100644 index 0000000000..fc656ccf2f --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-linux-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b5c18e5d60bd39ba44c63aa6a52663782297376d5fc9742b5208d40c06dbbcd +size 2569247 diff --git a/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-win32-x64.zip b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-win32-x64.zip new file mode 100644 index 0000000000..d2bcea4461 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/_bundle-assets/ripgrep-win32-x64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5dcdb115d6e5909d2d4bc7e555e9fa1af4ea582e98fada3bc25a7a2e93f943b +size 2123710 diff --git a/app/aws-lsp-codewhisperer-runtimes/package.json b/app/aws-lsp-codewhisperer-runtimes/package.json index d4653386be..67e9cbb738 100644 --- a/app/aws-lsp-codewhisperer-runtimes/package.json +++ b/app/aws-lsp-codewhisperer-runtimes/package.json @@ -5,9 +5,16 @@ "main": "out/index.js", "scripts": { "clean": "rm -rf out/ bin/ node_modules/ build/ dist/ tsconfig.tsbuildinfo .tsbuildinfo", - "compile": "tsc --build", + "compile": "tsc --build && copyfiles -f src/version.json out/", "package": "npm run compile && cross-env NODE_OPTIONS=--max_old_space_size=8172 npm run webpack", + "package:prod": "npm run compile && cross-env NODE_OPTIONS=--max_old_space_size=8172 npm run webpack:prod", "webpack": "webpack", + "webpack:prod": "webpack --config webpack.config.prod.js", + "copy:resources:agent-standalone": "copyfiles -f --error ../../node_modules/@aws/lsp-identity/src/sso/authorizationCodePkce/resources/**/* build/private/bundle/agent-standalone/resources", + "generate:node-assets": "./scripts/download-node.sh && ts-node src/scripts/copy-node-assets.ts", + "generate:build-archive": "./scripts/package.sh", + "ci:generate:agent-standalone": "npm run package:prod && npm run copy:resources:agent-standalone && npm run generate:node-assets && npm run generate:build-archive", + "ci:generate:manifest": "ts-node scripts/create-repo-manifest.ts", "start": "cross-env NODE_OPTIONS=--max_old_space_size=8172 node scripts/dev-server.js start", "stop-dev-server": "node scripts/dev-server.js stop", "test": "node scripts/test-runner.js", diff --git a/app/aws-lsp-codewhisperer-runtimes/scripts/create-repo-manifest.ts b/app/aws-lsp-codewhisperer-runtimes/scripts/create-repo-manifest.ts new file mode 100644 index 0000000000..dad9ce270c --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/scripts/create-repo-manifest.ts @@ -0,0 +1,346 @@ +// Produces an artifact manifest that is "close enough" to a real one, to +// reference artifacts attached to a GitHub release for main or feature branches. +// The GitHub release only ever holds one artifact version (the most recent commit), +// so the manifest will only ever contain a single artifact version. + +import * as fs from 'fs' +import { exec } from 'child_process' +import * as path from 'path' + +export type SemVer = string + +export type Version = { + name: string + version: SemVer +} + +export type Platform = 'windows' | 'linux' | 'darwin' +export type Arch = 'arm64' | 'x64' +export type TargetContent = { + filename: string + url: string + hashes: string[] + bytes: number +} + +export type PlatformTarget = { + platform: Platform + arch: Arch + contents: TargetContent[] +} + +export type ManifestServerVersionEntry = { + serverVersion: string + isDelisted: boolean + runtime: Version + capabilities?: Version[] + protocol?: Version[] + thirdPartyLicenses: string + targets: PlatformTarget[] +} + +export type Manifest = { + manifestSchemaVersion: string + artifactId: string + artifactDescription: string + isManifestDeprecated: boolean + versions: ManifestServerVersionEntry[] +} + +interface Params { + serverVersion: string + releaseArtifactsPath: string + repoUrl: string + gitHubReleaseName: string +} + +const serversZipName = 'servers.zip' +const clientsZipName = 'clients.zip' + +/** + * Updates the manifest file with new version information or performs rollback operations. + * + * @async + * @param {string} manifestPath - file path to save the manifest to. + * @param {Object} params - The parameters for updating the manifest. + * @param {string} params.serverVersion - The server version. + * @param {string} params.releaseArtifactsPath - folder containing the artifacts to load file attributes from + * @param {string} params.repoUrl - url to the github repo (https://github.com/aws/language-servers) + * @param {string} params.gitHubReleaseName - the name of the GitHub release this will refer to (pre-main) + * + * @description + * This function performs the following operations: + * 1. Calculates SHA384 checksums and file sizes for clients.zip and servers.zip files. + * 2. Generates a new manifest entry with the provided and calculated information. + * 3. Produces a manifest file, containing only this one version. + * 4. Saves the updated manifest to a file. + */ +export async function updateManifest( + manifestPath: string, + { serverVersion, releaseArtifactsPath, repoUrl, gitHubReleaseName }: Params +) { + function getGitHubReleaseDownloadUrl(filename: string) { + return `${repoUrl}/releases/download/${gitHubReleaseName}/${filename}` + } + + function getServerZipPath(platform: string, arch: string): string { + return path.join(releaseArtifactsPath, `${platform}-${arch}-${serversZipName}`) + } + + async function getServerZipFileInfo(platform: string, arch: string): Promise { + const serverZipPath = getServerZipPath(platform, arch) + const sha = await run(`sha384sum ${serverZipPath} | awk '{print $1}'`) + const bytes = await run(`wc -c < ${serverZipPath}`) + return { + url: getGitHubReleaseDownloadUrl(path.basename(serverZipPath)), + hash: sha, + bytes: bytes, + } + } + + const clientZipPath = path.join(releaseArtifactsPath, clientsZipName) + + async function getClientZipFileInfo() { + const sha = await run(`sha384sum ${clientZipPath} | awk '{print $1}'`) + const bytes = await run(`wc -c < ${clientZipPath}`) + return { + url: getGitHubReleaseDownloadUrl(clientsZipName), + hash: sha, + bytes: bytes, + } + } + + const manifest: Manifest = { + manifestSchemaVersion: '0.1', + artifactId: 'CodeWhispererStandaloneRuntimeServer', + artifactDescription: 'LSP servers with CodeWhisperer on standalone runtime', + isManifestDeprecated: false, + versions: [], + } + + const licensesURL = getGitHubReleaseDownloadUrl('THIRD_PARTY_LICENSES') + const newEntry = generateNewEntry({ + version: { + server: serverVersion, + }, + serverZips: { + win: { + x64: await getServerZipFileInfo('win', 'x64'), + arm64: await getServerZipFileInfo('win', 'x64'), + }, + linux: { + x64: await getServerZipFileInfo('linux', 'x64'), + arm64: await getServerZipFileInfo('linux', 'arm64'), + }, + mac: { + x64: await getServerZipFileInfo('mac', 'x64'), + arm64: await getServerZipFileInfo('mac', 'arm64'), + }, + }, + clientZip: await getClientZipFileInfo(), + licensesURL, + }) + + manifest.versions = [newEntry] + + fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)) +} + +interface FileInfo { + url: string + hash: string + bytes: string +} + +interface EntryParameters { + version: { + server: string + } + serverZips: { + win: { + x64: FileInfo + arm64: FileInfo + } + linux?: { + x64: FileInfo + arm64: FileInfo + } + mac?: { + x64: FileInfo + arm64: FileInfo + } + } + clientZip: FileInfo + licensesURL: string +} + +function generateNewEntry({ + version, + serverZips, + clientZip, + licensesURL, +}: EntryParameters): ManifestServerVersionEntry { + return { + serverVersion: version.server, + isDelisted: false, + runtime: { + name: 'standalone', + version: '0.0.1', // arbitrary, not used for alpha/preprod manifests + }, + thirdPartyLicenses: licensesURL, + targets: [ + { + platform: 'windows', + arch: 'x64', + contents: [ + { + filename: serversZipName, + url: serverZips.win.x64.url, + hashes: [`sha384:${serverZips.win.x64.hash}`], + bytes: parseInt(serverZips.win.x64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + { + platform: 'windows', + arch: 'arm64', + contents: [ + { + filename: serversZipName, + url: serverZips.win.arm64.url, + hashes: [`sha384:${serverZips.win.arm64.hash}`], + bytes: parseInt(serverZips.win.arm64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + { + platform: 'linux', + arch: 'x64', + contents: [ + { + filename: serversZipName, + url: serverZips.linux!.x64.url, + hashes: [`sha384:${serverZips.linux!.x64.hash}`], + bytes: parseInt(serverZips.linux!.x64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + { + platform: 'linux', + arch: 'arm64', + contents: [ + { + filename: serversZipName, + url: serverZips.linux!.arm64.url, + hashes: [`sha384:${serverZips.linux!.arm64.hash}`], + bytes: parseInt(serverZips.linux!.arm64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + { + platform: 'darwin', + arch: 'x64', + contents: [ + { + filename: serversZipName, + url: serverZips.mac!.x64.url, + hashes: [`sha384:${serverZips.mac!.x64.hash}`], + bytes: parseInt(serverZips.mac!.x64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + { + platform: 'darwin', + arch: 'arm64', + contents: [ + { + filename: serversZipName, + url: serverZips.mac!.arm64.url, + hashes: [`sha384:${serverZips.mac!.arm64.hash}`], + bytes: parseInt(serverZips.mac!.arm64.bytes), + }, + { + filename: clientsZipName, + url: clientZip.url, + hashes: [`sha384:${clientZip.hash}`], + bytes: parseInt(clientZip.bytes), + }, + ], + }, + ], + } +} + +function run(command: string): Promise { + return new Promise((resolve, reject) => { + exec(command, (error: any, stdout: string, stderr: string) => { + if (error) { + reject(error) + } else { + resolve(stdout.trim()) + } + }) + }) +} + +;(async () => { + console.log(`SERVER_VERSION: ${process.env.SERVER_VERSION}`) + console.log(`RELEASE_ARTIFACTS_PATH: ${process.env.RELEASE_ARTIFACTS_PATH}`) + console.log(`REPO_URL: ${process.env.REPO_URL}`) + console.log(`TAG_NAME: ${process.env.TAG_NAME}`) + + if (!process.env.SERVER_VERSION) { + throw new Error('Missing envvar: SERVER_VERSION') + } + + if (!process.env.RELEASE_ARTIFACTS_PATH) { + throw new Error('Missing envvar: RELEASE_ARTIFACTS_PATH') + } + + if (!process.env.REPO_URL) { + throw new Error('Missing envvar: REPO_URL') + } + + if (!process.env.TAG_NAME) { + throw new Error('Missing envvar: TAG_NAME') + } + + const releaseArtifactsPath = process.env.RELEASE_ARTIFACTS_PATH + const manifestPath = path.join(releaseArtifactsPath, 'manifest.json') + await updateManifest(manifestPath, { + serverVersion: process.env.SERVER_VERSION, + releaseArtifactsPath, + repoUrl: process.env.REPO_URL, + gitHubReleaseName: process.env.TAG_NAME, + }) +})() diff --git a/app/aws-lsp-codewhisperer-runtimes/scripts/download-node.sh b/app/aws-lsp-codewhisperer-runtimes/scripts/download-node.sh new file mode 100755 index 0000000000..f0635fd8ff --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/scripts/download-node.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +# Downloads node distibutions and places them in +# build/node-assets, which is picked up +# by src/scripts/copy-node-assets.ts, to produce the final bundle. + +set -e +NODE_VERSION="18" +BASE_URL="https://nodejs.org/download/release/latest-v${NODE_VERSION}.x" +SHASUMS_FILE="SHASUMS256.txt" +ASSETS_DIR="build/node-assets" + +# Download SHASUMS256.txt +wget -q "$BASE_URL/$SHASUMS_FILE" -O "$SHASUMS_FILE" + +# Extract exact Node.js version from any entry in SHASUMS256.txt +NODE_SEMVER=$(grep -o 'node-v[0-9]*\.[0-9]*\.[0-9]*' SHASUMS256.txt | head -1 | cut -d'v' -f2) + +if [ -z "$NODE_SEMVER" ]; then + echo "Failed to extract Node.js version from SHASUMS256.txt" + exit 1 +fi + +echo "Found latest Node.js version: $NODE_SEMVER" + +echo "Downloading assets for node version $NODE_SEMVER" + +# Remove all files from ASSETS directory +rm -rf "$ASSETS_DIR" && mkdir "$ASSETS_DIR" + +# Define expected files +EXPECTED_FILES=( + "win-x64/node.exe" + "node-v$NODE_SEMVER-linux-x64.tar.gz" + "node-v$NODE_SEMVER-darwin-arm64.tar.gz" + "node-v$NODE_SEMVER-linux-arm64.tar.gz" + "node-v$NODE_SEMVER-darwin-x64.tar.gz" +) + +# Process each expected file pattern +for actual_file in "${EXPECTED_FILES[@]}"; do + # Search for the file in SHASUMS256.txt + if grep -q "$actual_file" SHASUMS256.txt; then + filepath="$ASSETS_DIR/$actual_file" + expected_sum=$(grep "$actual_file" SHASUMS256.txt | awk '{print $1}') + echo "Found $actual_file with shasum: $expected_sum" + + echo "Updating $actual_file" + mkdir -p "$(dirname "$filepath")" + wget -q "$BASE_URL/$actual_file" -O $filepath + else + echo "Warning: $actual_file not found in SHASUMS256.txt" + fi +done + +# Fetch and escape the license text +LICENSE_URL="https://raw.githubusercontent.com/nodejs/node/v${NODE_SEMVER}/LICENSE" +LICENSE_FILE="$ASSETS_DIR/LICENSE" + +echo "Fetching Node.js license from $LICENSE_URL" +wget -q "$LICENSE_URL" -O "$LICENSE_FILE" + +# Verify the license file was downloaded successfully +if [ ! -s "$LICENSE_FILE" ]; then + echo "Downloaded license file is empty" + rm -f "$LICENSE_FILE" + exit 1 +fi + +echo "License file has been updated in $LICENSE_FILE" + +# Read the escaped license text +LICENSE_TEXT=$(cat "$LICENSE_FILE") + +# Update the attribution overrides file +ATTRIBUTION_FILE="../../attribution/overrides.json" + +# Create attribution file with empty JSON object if it doesn't exist +if [ ! -f "$ATTRIBUTION_FILE" ]; then + mkdir -p "$(dirname "$ATTRIBUTION_FILE")" + echo "{}" > "$ATTRIBUTION_FILE" +fi + +# Update version and licenseText fields using jq +# jq also escapes text by default +jq --indent 4 \ + --arg name "Node.js" \ + --arg version "$NODE_SEMVER" \ + --arg licenseText "$LICENSE_TEXT" \ + --arg url "https://github.com/nodejs/node" \ + --arg license "MIT" \ + '.node.name = $name | .node.version = $version | .node.url = $url | .node.license = $license | .node.licenseText = $licenseText' \ + "$ATTRIBUTION_FILE" > "$ATTRIBUTION_FILE.tmp" && mv "$ATTRIBUTION_FILE.tmp" "$ATTRIBUTION_FILE" +echo "Successfully updated Node.js version and license in $ATTRIBUTION_FILE" + +# Cleanup +rm -f "$SHASUMS_FILE" \ No newline at end of file diff --git a/app/aws-lsp-codewhisperer-runtimes/scripts/package.sh b/app/aws-lsp-codewhisperer-runtimes/scripts/package.sh new file mode 100755 index 0000000000..021b4b8080 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/scripts/package.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +# This script collects all of the files needed for bundling and packages them +# into clients.zip and one servers.zip file per platform. +# Bundled outputs are placed in +# - build/archives/agent-standalone/(platform)-(architecture) +# - build/archives/shared + +set -euxo pipefail + +configs=("agent-standalone") + +# Move chat client bundle to bundle folder +START_DIR=$(pwd) +CHAT_CLIENT_BUNDLE_DIR=$(pwd)/../../node_modules/@aws/chat-client/build +TARGET_BUILD_DIR=./build/private/bundle/client + +mkdir -p $TARGET_BUILD_DIR +cp -r $CHAT_CLIENT_BUNDLE_DIR/* $TARGET_BUILD_DIR + +# ZIP client files +ARCHIVES_DIR=./build/archives +mkdir -p $ARCHIVES_DIR/shared +zip -j $ARCHIVES_DIR/shared/clients.zip $TARGET_BUILD_DIR/* + +# Create tempdir for unzipped qcontext files +TEMP_DIR=$(mktemp -d) +trap 'rm -rf -- "$TEMP_DIR"' EXIT + +# Unzip each platform-specific file into its own subdirectory +# Windows x64 +mkdir -p $TEMP_DIR/win-x64 +unzip -o ./_bundle-assets/qserver-win32-x64.zip -d $TEMP_DIR/win-x64 +mv $TEMP_DIR/win-x64/qserver $TEMP_DIR/win-x64/indexing +unzip -o ./_bundle-assets/ripgrep-win32-x64.zip -d $TEMP_DIR/win-x64 + +# Linux x64 +mkdir -p $TEMP_DIR/linux-x64 +unzip -o ./_bundle-assets/qserver-linux-x64.zip -d $TEMP_DIR/linux-x64 +mv $TEMP_DIR/linux-x64/qserver $TEMP_DIR/linux-x64/indexing +unzip -o ./_bundle-assets/ripgrep-linux-x64.zip -d $TEMP_DIR/linux-x64 + +# Mac x64 +mkdir -p $TEMP_DIR/mac-x64 +unzip -o ./_bundle-assets/qserver-darwin-x64.zip -d $TEMP_DIR/mac-x64 +mv $TEMP_DIR/mac-x64/qserver $TEMP_DIR/mac-x64/indexing +unzip -o ./_bundle-assets/ripgrep-darwin-x64.zip -d $TEMP_DIR/mac-x64 + +# Linux ARM64 +mkdir -p $TEMP_DIR/linux-arm64 +unzip -o ./_bundle-assets/qserver-linux-arm64.zip -d $TEMP_DIR/linux-arm64 +mv $TEMP_DIR/linux-arm64/qserver $TEMP_DIR/linux-arm64/indexing +unzip -o ./_bundle-assets/ripgrep-linux-arm64.zip -d $TEMP_DIR/linux-arm64 + +# Mac ARM64 +mkdir -p $TEMP_DIR/mac-arm64 +unzip -o ./_bundle-assets/qserver-darwin-arm64.zip -d $TEMP_DIR/mac-arm64 +mv $TEMP_DIR/mac-arm64/qserver $TEMP_DIR/mac-arm64/indexing +unzip -o ./_bundle-assets/ripgrep-darwin-arm64.zip -d $TEMP_DIR/mac-arm64 + +# ZIP server files +for config in "${configs[@]}"; do + mkdir -p $ARCHIVES_DIR/${config}/linux-x64 + mkdir -p $ARCHIVES_DIR/${config}/mac-x64 + mkdir -p $ARCHIVES_DIR/${config}/linux-arm64 + mkdir -p $ARCHIVES_DIR/${config}/mac-arm64 + mkdir -p $ARCHIVES_DIR/${config}/win-x64 + + # Win x64 + zip -j $ARCHIVES_DIR/${config}/win-x64/servers.zip \ + ./build/private/assets/win-x64/* + if [ "$config" = "agent-standalone" ]; then + (cd $TEMP_DIR/win-x64 && zip -r $OLDPWD/$ARCHIVES_DIR/${config}/win-x64/servers.zip indexing ripgrep/rg.exe) + fi + + # Linux x64 + zip -j $ARCHIVES_DIR/${config}/linux-x64/servers.zip \ + ./build/private/assets/linux-x64/* + if [ "$config" = "agent-standalone" ]; then + (cd $TEMP_DIR/linux-x64 && zip -r $OLDPWD/$ARCHIVES_DIR/${config}/linux-x64/servers.zip indexing ripgrep/rg) + fi + + # Mac x64 + zip -j $ARCHIVES_DIR/${config}/mac-x64/servers.zip \ + ./build/private/assets/mac-x64/* + if [ "$config" = "agent-standalone" ]; then + (cd $TEMP_DIR/mac-x64 && zip -r $OLDPWD/$ARCHIVES_DIR/${config}/mac-x64/servers.zip indexing ripgrep/rg) + fi + + # Linux ARM64 + zip -j $ARCHIVES_DIR/${config}/linux-arm64/servers.zip \ + ./build/private/assets/linux-arm64/* + if [ "$config" = "agent-standalone" ]; then + (cd $TEMP_DIR/linux-arm64 && zip -r $OLDPWD/$ARCHIVES_DIR/${config}/linux-arm64/servers.zip indexing ripgrep/rg) + fi + + # Mac ARM64 + zip -j $ARCHIVES_DIR/${config}/mac-arm64/servers.zip \ + ./build/private/assets/mac-arm64/* + if [ "$config" = "agent-standalone" ]; then + (cd $TEMP_DIR/mac-arm64 && zip -r $OLDPWD/$ARCHIVES_DIR/${config}/mac-arm64/servers.zip indexing ripgrep/rg) + fi +done + +cd ./build/private/bundle +for config in "${configs[@]}"; do + cd ${config} + zip -r ../../../../$ARCHIVES_DIR/${config}/win-x64/servers.zip . + zip -r ../../../../$ARCHIVES_DIR/${config}/linux-x64/servers.zip . + zip -r ../../../../$ARCHIVES_DIR/${config}/mac-x64/servers.zip . + zip -r ../../../../$ARCHIVES_DIR/${config}/linux-arm64/servers.zip . + zip -r ../../../../$ARCHIVES_DIR/${config}/mac-arm64/servers.zip . + + cd .. +done + +cd $START_DIR + +for config in "${configs[@]}"; do + echo "Artifact Bundle Available in: $START_DIR/build/archives/${config}" +done diff --git a/app/aws-lsp-codewhisperer-runtimes/src/agent-standalone.ts b/app/aws-lsp-codewhisperer-runtimes/src/agent-standalone.ts index 8c972438f8..7996472ada 100644 --- a/app/aws-lsp-codewhisperer-runtimes/src/agent-standalone.ts +++ b/app/aws-lsp-codewhisperer-runtimes/src/agent-standalone.ts @@ -19,13 +19,11 @@ import { } from '@aws/lsp-codewhisperer/out/language-server/agenticChat/tools/toolServer' import { RuntimeProps } from '@aws/language-server-runtimes/runtimes/runtime' -const MAJOR = 0 -const MINOR = 1 -const PATCH = 0 -const VERSION = `${MAJOR}.${MINOR}.${PATCH}` +const versionJson = require('./version.json') +const version = versionJson.agenticChat const props = { - version: VERSION, + version: version, servers: [ CodeWhispererServerTokenProxy, CodeWhispererSecurityScanServerTokenProxy, diff --git a/app/aws-lsp-codewhisperer-runtimes/src/scripts/copy-node-assets.ts b/app/aws-lsp-codewhisperer-runtimes/src/scripts/copy-node-assets.ts new file mode 100644 index 0000000000..c1ac59c576 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/src/scripts/copy-node-assets.ts @@ -0,0 +1,84 @@ +import * as fsPromises from 'fs/promises' +import * as path from 'path' +import { exec } from 'child_process' + +// This script takes node distributions downloaded by scripts/download-node.sh +// and places the necessary files in locations for bundling into servers.zip. +// node application files are extracted from tgz files in build/node-assets +// into build/private/assets/(platform)-(architecture)/ + +// Ensure directory exists +async function ensureDirectory(dirPath: string): Promise { + try { + await fsPromises.access(dirPath) + } catch { + await fsPromises.mkdir(dirPath, { recursive: true }) + } +} + +// Copy directory recursively +async function copyDirectory(src: string, dest: string): Promise { + await ensureDirectory(dest) + const entries = await fsPromises.readdir(src, { withFileTypes: true }) + + for (const entry of entries) { + const srcPath = path.join(src, entry.name) + const destPath = path.join(dest, entry.name) + + if (entry.isDirectory()) { + await copyDirectory(srcPath, destPath) + } else { + await fsPromises.copyFile(srcPath, destPath) + } + } +} + +async function copyWindowsAssets() { + const sourceDir = 'build/node-assets/win-x64' + const destDir = 'build/private/assets/win-x64' + await ensureDirectory(path.dirname(destDir)) + await copyDirectory(sourceDir, destDir) +} + +async function copyLinuxAndMacAssets() { + const overridesContent = await fsPromises.readFile('../../attribution/overrides.json', 'utf8') + const version = JSON.parse(overridesContent).node.version + const nodeAssetsRoot = 'build/node-assets' + const linuxX64 = `node-v${version}-linux-x64` + const macX64 = `node-v${version}-darwin-x64` + const linuxArm64 = `node-v${version}-linux-arm64` + const macArm64 = `node-v${version}-darwin-arm64` + + await run(`cd ${nodeAssetsRoot} && tar -xzf ${linuxX64}.tar.gz --strip-components=2 ${linuxX64}/bin/node`) + await ensureDirectory('build/private/assets/linux-x64') + await fsPromises.rename(`${nodeAssetsRoot}/node`, 'build/private/assets/linux-x64/node') + + await run(`cd ${nodeAssetsRoot} && tar -xzf ${macX64}.tar.gz --strip-components=2 ${macX64}/bin/node`) + await ensureDirectory('build/private/assets/mac-x64') + await fsPromises.rename(`${nodeAssetsRoot}/node`, 'build/private/assets/mac-x64/node') + + await run(`cd ${nodeAssetsRoot} && tar -xzf ${linuxArm64}.tar.gz --strip-components=2 ${linuxArm64}/bin/node`) + await ensureDirectory('build/private/assets/linux-arm64') + await fsPromises.rename(`${nodeAssetsRoot}/node`, 'build/private/assets/linux-arm64/node') + + await run(`cd ${nodeAssetsRoot} && tar -xzf ${macArm64}.tar.gz --strip-components=2 ${macArm64}/bin/node`) + await ensureDirectory('build/private/assets/mac-arm64') + await fsPromises.rename(`${nodeAssetsRoot}/node`, 'build/private/assets/mac-arm64/node') +} + +function run(command: string): Promise { + return new Promise((resolve, reject) => { + exec(command, (error: any, stdout: string, stderr: string) => { + if (error) { + reject(error) + } else { + resolve(stdout.trim()) + } + }) + }) +} + +;(async () => { + await copyWindowsAssets() + await copyLinuxAndMacAssets() +})() diff --git a/app/aws-lsp-codewhisperer-runtimes/src/version.json b/app/aws-lsp-codewhisperer-runtimes/src/version.json new file mode 100644 index 0000000000..002b19fa71 --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/src/version.json @@ -0,0 +1,3 @@ +{ + "agenticChat": "1.24.0" +} diff --git a/app/aws-lsp-codewhisperer-runtimes/webpack.config.prod.js b/app/aws-lsp-codewhisperer-runtimes/webpack.config.prod.js new file mode 100644 index 0000000000..d3b81acfcd --- /dev/null +++ b/app/aws-lsp-codewhisperer-runtimes/webpack.config.prod.js @@ -0,0 +1,54 @@ +const path = require('node:path') + +// This script is used to produce the distributable webpacked version of the agentic chat server. + +const baseConfig = { + mode: 'production', + resolve: { + extensions: ['.ts', '.tsx', '.js', '.node'], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + { + test: /\.node$/, + loader: 'node-loader', + options: { + name: '[name].[ext]', // Preserves original path and filename + }, + }, + ], + }, + output: { + path: __dirname, + globalObject: 'this', + library: { + type: 'umd', + }, + }, + target: 'node', + experiments: { + asyncWebAssembly: true, + }, +} + +const serverConfig = config => { + return { + ...baseConfig, + output: { + ...baseConfig.output, + path: path.resolve(__dirname, 'build', 'private', 'bundle', config), + filename: `[name].js`, + chunkFormat: false, + }, + entry: { + 'aws-lsp-codewhisperer': `./src/${config}.ts`, + }, + } +} + +module.exports = [serverConfig('agent-standalone')] diff --git a/attribution/overrides.json b/attribution/overrides.json new file mode 100644 index 0000000000..ed989c78d2 --- /dev/null +++ b/attribution/overrides.json @@ -0,0 +1,15 @@ +{ + "file-description": "Used by generate-attribution in script/generate-attribution.sh", + "@aws/language-server-runtimes": { + "ignore": true + }, + "@aws/lsp-codewhisperer": { + "ignore": true + }, + "@aws/lsp-core": { + "ignore": true + }, + "caniuse-lite": { + "ignore": true + } +} diff --git a/package-lock.json b/package-lock.json index 93b66e14b6..7a703c9b43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,9 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-unused-imports": "^4.1.4", "husky": "^9.1.7", + "license-checker": "^25.0.1", "node-loader": "^2.1.0", + "oss-attribution-generator": "^1.7.1", "prettier": "^3.3.3", "pretty-quick": "^4.0.0", "shx": "^0.3.4", @@ -10803,6 +10805,12 @@ "node": ">=16.5.0" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -11251,6 +11259,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -11362,6 +11379,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, "node_modules/asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -11908,6 +11931,12 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/bn.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", @@ -11947,6 +11976,110 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "node_modules/bower": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz", + "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==", + "dev": true, + "bin": { + "bower": "bin/bower" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-json": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.8.4.tgz", + "integrity": "sha512-mMKghvq9ivbuzSsY5nrOLnDtZIJMUCpysqbGaGW3mj88JAcuSi8ZAzIt34vNZjohy0aR9VXLwgPTZGnBX2Vpjg==", + "dev": true, + "dependencies": { + "deep-extend": "^0.5.1", + "ends-with": "^0.2.0", + "ext-list": "^2.0.0", + "graceful-fs": "^4.1.3", + "intersect": "^1.0.1", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-json/node_modules/deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/bower-license": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bower-license/-/bower-license-0.4.4.tgz", + "integrity": "sha512-zkDh1GlJkXNFNdlw/JVjihbYsLw5aJhnZnEMMSXLuFKxhJaz+SGFJDOfhBiPZxrASsQCEohuU9EPYdUj1X3GwA==", + "dev": true, + "dependencies": { + "bower-json": "~0.4.0", + "npm-license": "~0.3.3", + "package-license": "~0.1.1", + "raptor-args": "~1.0.1", + "treeify": "~1.0.1", + "underscore": "~1.5.2" + }, + "bin": { + "bower-license": "bin/bower-license" + } + }, + "node_modules/bower-license/node_modules/bower-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "integrity": "sha512-CiCTvl2OndArvZjWYvaOuQWI/fjeaBz8wPLF8MWadHT+ULaBDqtQIOYqQFsxtzUFw6E206960mlZfiUuR1PPBg==", + "dev": true, + "dependencies": { + "deep-extend": "~0.2.5", + "graceful-fs": "~2.0.0", + "intersect": "~0.0.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-license/node_modules/deep-extend": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", + "integrity": "sha512-t2N+4ihO7YgydJOUI47I6GdXpONJ+jUZmYeTNiifALaEduiCja1mKcq3tuSp0RhA9mMfxdMN3YskpwB7puMAtw==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/bower-license/node_modules/graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-license/node_modules/intersect": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", + "integrity": "sha512-Bp/mSG9dsq/eOMk2Q7DyjKxY62TTU2RvNvycjXHhi5TjrA72H+I3c5+1nAOAqtENcrQvCb5NDlsoPWJ4Bh01SA==", + "dev": true + }, + "node_modules/bower-license/node_modules/treeify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.0.1.tgz", + "integrity": "sha512-i3MKN4nGEOuVAcd7s5MtAc2+QBExwcaRT/6/CzUSYVYwzM58bJ3H3wwCPu2PEAGjVPHjfIC/MPaXsxPGUk07cg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -13633,6 +13766,16 @@ } } }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -13905,6 +14048,16 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -14325,6 +14478,15 @@ "once": "^1.4.0" } }, + "node_modules/ends-with": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz", + "integrity": "sha512-lRppY4dK3VkqBdR242sKcAJeYc8Gf/DhoX9AWvWI2RzccmLnqBQfwm2k4oSDv5MPDjUqawCauXhZkyWxkVhRsg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", @@ -15576,6 +15738,18 @@ "express": ">= 4.11" } }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -16051,6 +16225,86 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, + "node_modules/fs-jetpack": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-0.12.0.tgz", + "integrity": "sha512-Xhuoorec62B9LwumWmlcPD9/pussEmpHa4Udyhuu2w0fLZ2sI8AJQ2ZDpkkMpcvDbybOiahZaCmGwAl7yPvbTg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "q": "^1.0.1", + "rimraf": "^2.2.8" + } + }, + "node_modules/fs-jetpack/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fs-jetpack/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", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-jetpack/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fs-jetpack/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fs-jetpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -16562,6 +16816,30 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, + "node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "dependencies": { + "ansi-regex": "^0.2.0" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -17254,6 +17532,21 @@ "node": ">= 0.10" } }, + "node_modules/intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", + "integrity": "sha512-qsc720yevCO+4NydrJWgEWKccAQwTOvj2m73O/VBA6iUL2HGZJ9XqBiyraNrBXX/W1IAjdpXdRZk24sq8TzBRg==", + "dev": true + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -17808,6 +18101,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -17865,6 +18164,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is2": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/is2/-/is2-0.0.11.tgz", + "integrity": "sha512-d3CswkUZ7i1wxhbRanVqfUsVRQXZrDC7iALpPg4I5IJdL9nbJSJQBjOMk0hhyO+B5H8a1LQKgn7n1uX4ZF9I8w==", + "dev": true, + "dependencies": { + "deep-is": "0.1.2" + }, + "engines": { + "node": ">=v0.6.0" + } + }, + "node_modules/is2/node_modules/deep-is": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.2.tgz", + "integrity": "sha512-+ykBpFL44/E8TlSBn0kDHZ1+IseXxUu/Om3bS2nqNscaeYWzxx54R9CewU6pLrsXLmEeTRZsGMTQIHfSUEEcUw==", + "dev": true + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -19455,6 +19772,18 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -19477,51 +19806,222 @@ "node": ">= 0.8.0" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "node_modules/license-checker": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz", + "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", + "dev": true, "dependencies": { - "immediate": "~3.0.5" + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" + }, + "bin": { + "license-checker": "bin/license-checker" } }, - "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 - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "devOptional": true, + "node_modules/license-checker/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=6.11.5" + "node": ">=4" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/license-checker/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=4" } }, - "node_modules/locate-app": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", - "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", + "node_modules/license-checker/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "funding": [ - { - "type": "individual", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/license-checker/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/license-checker/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/license-checker/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/license-checker/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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 + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "devOptional": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-app": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", + "dev": true, + "funding": [ + { + "type": "individual", "url": "https://buymeacoffee.com/hejny" }, { @@ -20478,6 +20978,25 @@ "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", "license": "MIT" }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/nopt-usage": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz", + "integrity": "sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==", + "dev": true + }, "node_modules/normalize-package-data": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", @@ -20523,6 +21042,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-license": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/npm-license/-/npm-license-0.3.3.tgz", + "integrity": "sha512-NxvqmkWieR7fFwzUu1bLky75flVrxTB+Le/C/opOChFaF04o+kl6ng3FW9b51ce8rVdw6ma9rsvpu6Uok5eg/g==", + "dev": true, + "dependencies": { + "mkdirp": "~0.5.0", + "nopt": "~3.0.1", + "nopt-usage": "^0.1.0", + "package-license": "~0.1.1", + "pkginfo": "^0.3.0", + "read-installed": "~4.0.3", + "treeify": "~1.0.1", + "underscore": "~1.4.4" + }, + "bin": { + "npm-license": "bin/npm-license" + } + }, + "node_modules/npm-license/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/npm-license/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm-license/node_modules/treeify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.0.1.tgz", + "integrity": "sha512-i3MKN4nGEOuVAcd7s5MtAc2+QBExwcaRT/6/CzUSYVYwzM58bJ3H3wwCPu2PEAGjVPHjfIC/MPaXsxPGUk07cg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npm-license/node_modules/underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==", + "dev": true + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -20782,6 +21365,27 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-proxy-config": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/os-proxy-config/-/os-proxy-config-1.1.2.tgz", @@ -20801,6 +21405,480 @@ "node": ">=0.10.0" } }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/oss-attribution-generator": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/oss-attribution-generator/-/oss-attribution-generator-1.7.1.tgz", + "integrity": "sha512-ReLf/UJ3z3ZEhzW6XD4HswUIoUgEUVq8I+amX12DqFwcEYhw8HGGhn2mrk7afqXuT+4AZiPDEhwDXtZSgtnOeA==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "bower": "^1.8.0", + "bower-json": "^0.8.1", + "bower-license": "^0.4.4", + "fs-jetpack": "^0.12.0", + "license-checker": "^13.0.3", + "lodash": "^4.17.4", + "spdx-licenses": "^0.0.3", + "taim": "^1.0.2", + "yargs": "^7.0.2" + }, + "bin": { + "generate-attribution": "index.js" + } + }, + "node_modules/oss-attribution-generator/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "dependencies": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/license-checker": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-13.1.0.tgz", + "integrity": "sha512-0sqnOzLkYYSZKzR3IO7q/1Drksin6IH1nlUgXE61ycWvF807UmFHV1fSDf6fGw5woQ0On/Gmh1YvVZ2jYMjUwQ==", + "dev": true, + "dependencies": { + "chalk": "~0.5.1", + "debug": "^2.2.0", + "mkdirp": "^0.3.5", + "nopt": "^2.2.0", + "read-installed": "~4.0.3", + "semver": "^5.3.0", + "spdx": "^0.5.1", + "spdx-correct": "^2.0.3", + "spdx-satisfies": "^0.1.3", + "treeify": "^1.0.1" + }, + "bin": { + "license-checker": "bin/license-checker" + } + }, + "node_modules/oss-attribution-generator/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/oss-attribution-generator/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/oss-attribution-generator/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/oss-attribution-generator/node_modules/spdx-compare": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-0.1.2.tgz", + "integrity": "sha512-Wc1aAqOHvP0e9H6Q6Ie56rGc9Mn00xmhqiB1BaKfMsBpJw/BPp6FLkuKxLcubHXIXwAKTTyvA2E74aPUv8OA8A==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^1.0.0", + "spdx-ranges": "^1.0.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/spdx-compare/node_modules/spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha512-xMXXC4eLKaIskvZm89nZi/MstVv1UtGk3nJz9BBKjreMVyoWisWFKfboH+kJS97+wUyBLpO/8ghV9M5VvrwwrA==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/spdx-correct": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", + "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^2.0.1", + "spdx-license-ids": "^2.0.1" + } + }, + "node_modules/oss-attribution-generator/node_modules/spdx-expression-parse": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", + "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.0.0", + "spdx-license-ids": "^2.0.1" + } + }, + "node_modules/oss-attribution-generator/node_modules/spdx-license-ids": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", + "integrity": "sha512-3RF4t5oYLlynWVIsKsmmGVM0obnTBK8ElS+2XSwRIYdf1U12aT8jS8MVHv1BH/tKrUKckogK5qJt/T+IMQZlAg==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/spdx-ranges": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-1.0.1.tgz", + "integrity": "sha512-re78PYmpAkAqL63aWC+Xnf2GOhOP37uldGWCslThw+NHKuOSPmLATVfNFyetdjyF6F9yHxn5/XzvFHH6CHFjJA==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/spdx-satisfies": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-0.1.3.tgz", + "integrity": "sha512-SdspT8Tv3RyHlH8pESd/rWEXII4Ho3sRr9KYeGAUbhVF+Z8loYdcMg8taog1551DMwHcdV/FK725lEANTehPhg==", + "dev": true, + "dependencies": { + "spdx-compare": "^0.1.2", + "spdx-expression-parse": "^1.0.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/spdx-satisfies/node_modules/spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha512-xMXXC4eLKaIskvZm89nZi/MstVv1UtGk3nJz9BBKjreMVyoWisWFKfboH+kJS97+wUyBLpO/8ghV9M5VvrwwrA==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oss-attribution-generator/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/oss-attribution-generator/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/oss-attribution-generator/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -20945,6 +22023,12 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, + "node_modules/package-license": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/package-license/-/package-license-0.1.2.tgz", + "integrity": "sha512-Q5zmx+M9ZJneMpYS6MlYL77gqeMYWuyErXMnQ/83WCztmYQD7Z0U9XGLvX9OKFFXwRj2NzdzlM0y9Jzcww2O1Q==", + "dev": true + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -21179,6 +22263,29 @@ "node": ">=16" } }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -21280,7 +22387,28 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/pino": { @@ -21497,6 +22625,15 @@ "node": ">=8" } }, + "node_modules/pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -21609,6 +22746,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pretty-ms": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", @@ -21844,6 +22990,17 @@ } ] }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -21915,6 +23072,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ramda": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.18.0.tgz", + "integrity": "sha512-bSgBktaZE0uDH5KmMpbizsxSNcw9MumqtouUVUrxHZSunm+WdDc/UlzwWFtgqMfngX7TZ12d9QsyWkYK7OoJSw==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -21940,6 +23103,12 @@ "node": ">= 0.6" } }, + "node_modules/raptor-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/raptor-args/-/raptor-args-1.0.3.tgz", + "integrity": "sha512-dxcvspDOzYGTF4lonon711avlxvcX5s/XTqNNGSaz59cy4Tik+Z6jDFDSVGpAaOL71cc01kc3u3AdxgPIKG+RQ==", + "dev": true + }, "node_modules/raw-body": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", @@ -21990,6 +23159,116 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/read-installed": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", + "integrity": "sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/read-installed/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/read-package-json/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", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", @@ -22198,6 +23477,19 @@ "node": ">=10" } }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -22407,6 +23699,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -23492,6 +24790,15 @@ "node": ">=8" } }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -23557,6 +24864,39 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23600,6 +24940,28 @@ } ] }, + "node_modules/spdx": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/spdx/-/spdx-0.5.2.tgz", + "integrity": "sha512-WQbfCQT2uKLsDllnO9ItpcGUiiF1O/ZvBGCyqFZRg122HgiZubpwpZiM7BkmH19HC3XR3Z+DFMGJNzXSPebG8A==", + "deprecated": "see spdx-expression-parse, spdx-satisfies, &c.", + "dev": true, + "dependencies": { + "spdx-exceptions": "^1.0.0", + "spdx-license-ids": "^1.0.0" + } + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", + "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -23632,6 +24994,54 @@ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true }, + "node_modules/spdx-licenses": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/spdx-licenses/-/spdx-licenses-0.0.3.tgz", + "integrity": "sha512-T9bEF+Q2ugCCyFp3c9t5ROjLFGTNxDJBobjK5muQlEM5ATKRDwjprTOwpwbrc/+WcBzHvPck/roTMfC9YHWbCQ==", + "dev": true, + "dependencies": { + "debug": "0.7.4", + "is2": "0.0.11" + } + }, + "node_modules/spdx-licenses/node_modules/debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", + "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", + "dev": true + }, + "node_modules/spdx-satisfies": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz", + "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==", + "dev": true, + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx/node_modules/spdx-exceptions": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", + "integrity": "sha512-gJ2SzvQuUNno1/G6sDRHP2CN+Hfi+weHY9E+kTvB8zxH/CTkhazfYazuZcwhXtwWbDKl5CAJ1fBbqAgpkd8CCQ==", + "dev": true + }, + "node_modules/spdx/node_modules/spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha512-qIBFhkh6ILCWNeWEe3ODFPKDYhPJrZpqdNCI2Z+w9lNdH5hoVEkfRLLbRfoIi8fb4xRYmpEOaaMH4G2pwYp/iQ==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -24043,6 +25453,93 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/taim": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/taim/-/taim-1.1.0.tgz", + "integrity": "sha512-NvqllOkhHKSG6llRKhrRLIzXHnbfyfTdcObDGIEqea9098ierzuowZyYAuHHf+JbpOhfKSisbe2bIVuA2nEaRA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "pretty-hrtime": "^1.0.0", + "ramda": "0.18.x" + } + }, + "node_modules/taim/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/taim/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/taim/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/taim/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/taim/node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/taim/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/taim/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -24431,6 +25928,15 @@ "tslib": "2" } }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -25077,6 +26583,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz", + "integrity": "sha512-yejOFsRnTJs0N9CK5Apzf6maDO2djxGoLLrlZlvGs2o9ZQuhIhDL18rtFyy4FBIbOkzA6+4hDgXbgz5EvDQCXQ==", + "dev": true + }, "node_modules/undici": { "version": "6.21.3", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", @@ -25229,6 +26741,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==", + "dev": true + }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -26478,6 +27996,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", diff --git a/package.json b/package.json index 4327ab29e3..82468102ab 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "test:coverage": "npm run compile && npm run test:coverage --workspaces --if-present", "coverage:report": "npm run coverage:report --workspaces --if-present", "coverage:check": "npm run coverage:check --workspaces --if-present", - "package": "npm run compile && npm run package --workspaces --if-present" + "package": "npm run compile && npm run package --workspaces --if-present", + "ci:generate:agentic:attribution": "ts-node ./script/prepare-agentic-attribution-dependencies.ts && ./script/generate-agentic-attribution.sh && git restore package.json" }, "dependencies": { "@aws/language-server-runtimes": "^0.2.116", @@ -53,7 +54,9 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-unused-imports": "^4.1.4", "husky": "^9.1.7", + "license-checker": "^25.0.1", "node-loader": "^2.1.0", + "oss-attribution-generator": "^1.7.1", "prettier": "^3.3.3", "pretty-quick": "^4.0.0", "shx": "^0.3.4", diff --git a/script/generate-agentic-attribution.sh b/script/generate-agentic-attribution.sh new file mode 100755 index 0000000000..44b9f2005c --- /dev/null +++ b/script/generate-agentic-attribution.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# This script performs license checks and compiles a license attribution file +# for the agentic chat bundle. +# It requires prepare-attribution-dependencies.ts to run first, in order to +# handle multiple packages from this monorepo. +# +# To use, call npm run ci:generate:agentic:attribution + +set -euo pipefail + +#---------------------------------------- +# Perform license checks +#---------------------------------------- + +EXCLUDED_PACKAGES=("@amzn/monorepo-language-servers" "@aws/lsp-codewhisperer" "@aws/lsp-core" "@amzn/dexp-runtime-server-build-configuration" "caniuse-lite" "pako") +EXCLUDED_LICENSES="MIT,Apache-2.0,BSD-2-Clause,BSD-3-Clause,ISC,0BSD,Python-2.0,BlueOak-1.0.0" + +process_packages() { + local output="$1" + IFS=$'\n' + + for line in $output; do + # Extract package_name from "package_name@1.0.0" + if [[ "$line" =~ ^├─\ (.+)@ ]]; then + package_name="${BASH_REMATCH[1]}" + + if [[ ! "${EXCLUDED_PACKAGES[*]}" =~ "${package_name}" ]]; then + echo "License for package '$package_name' is either not pre-approved or package is not in the excluded package list." + exit 1 + fi + fi + done + + IFS=$' \t\n' +} + +LICENSE_CHECK_RESULT=$(npx license-checker --production --exclude $EXCLUDED_LICENSES) +process_packages "$LICENSE_CHECK_RESULT" + +#---------------------------------------- +# Generate attribution file +#---------------------------------------- + +# The attribution folder is where overrides.json is, which influences generate-attribution behavior. +ATTRIBUTION_FOLDER="attribution" +mkdir -p $ATTRIBUTION_FOLDER + +(npx generate-attribution --outputDir $ATTRIBUTION_FOLDER)>/dev/null + +ATTRIBUTION_HEADER="The Amazon aws-lsp-codewhisperer bundle includes the following third-party software/licensing:\n\n" +(echo -e $ATTRIBUTION_HEADER && cat "$ATTRIBUTION_FOLDER/attribution.txt") > "$ATTRIBUTION_FOLDER/THIRD_PARTY_LICENSES" + +echo "Third party attribution: $ATTRIBUTION_FOLDER/THIRD_PARTY_LICENSES" + +rm $ATTRIBUTION_FOLDER/attribution.txt +rm $ATTRIBUTION_FOLDER/licenseInfos.json + +echo "Attribution generation completed." diff --git a/script/prepare-agentic-attribution-dependencies.ts b/script/prepare-agentic-attribution-dependencies.ts new file mode 100644 index 0000000000..cdace5410b --- /dev/null +++ b/script/prepare-agentic-attribution-dependencies.ts @@ -0,0 +1,114 @@ +#!/usr/bin/env ts-node + +/** + * This script is used by CI to gather package.json dependencies that should be + * included in the license attribution. + * + * It is a hack -- the tooling used to gather licenses is not compatible with + * monorepo workspaces. + * + * As long as 'npm install' has been run, the root node_modules folder will contain + * the dependency packages for the full workspace. We then add dependency entries + * to the root package.json from agentic chat related workspace packages (which + * then have a valid reference to content in node_modules). + * + * This script is intended to be run just prior to generate-agentic-attribution.sh. + * It mutates package.json, but the intention is to run this in CI, and discard the mutation. + * + * To properly use this script, call npm run ci:generate:agentic:attribution + */ + +import * as fs from 'fs' +import * as path from 'path' + +interface PackageJson { + dependencies?: Record + [key: string]: any +} + +/** + * The packages in this monorepo that we want to accumulate dependencies from + */ +const TARGET_PACKAGE_FILES = [ + 'app/aws-lsp-codewhisperer-runtimes/package.json', + 'chat-client/package.json', + 'core/aws-lsp-core/package.json', + 'server/aws-lsp-codewhisperer/package.json', + 'server/aws-lsp-identity/package.json', +] + +const ROOT_PACKAGE_JSON = './package.json' + +function readPackageJson(filePath: string): PackageJson { + try { + const content = fs.readFileSync(filePath, 'utf8') + return JSON.parse(content) + } catch (error) { + console.error(`Error reading ${filePath}:`, error) + throw error + } +} + +function writePackageJson(filePath: string, packageJson: PackageJson): void { + try { + const content = JSON.stringify(packageJson, null, 2) + '\n' + fs.writeFileSync(filePath, content, 'utf8') + } catch (error) { + console.error(`Error writing ${filePath}:`, error) + throw error + } +} + +function gatherDependencies(): void { + console.log('Gathering dependencies from target packages...') + + // Read root package.json + const rootPackage = readPackageJson(ROOT_PACKAGE_JSON) + + // Ensure dependencies section exists + if (!rootPackage.dependencies) { + rootPackage.dependencies = {} + } + + let addedCount = 0 + let skippedCount = 0 + + // Process each target package.json file + for (const targetFile of TARGET_PACKAGE_FILES) { + const fullPath = path.resolve(targetFile) + + if (!fs.existsSync(fullPath)) { + console.warn(`Warning: ${targetFile} does not exist, skipping...`) + continue + } + + console.log(`Processing ${targetFile}...`) + const targetPackage = readPackageJson(fullPath) + + // Add non-duplicate entries to the root package.json dependencies from + // the currently loaded package.json. + if (targetPackage.dependencies) { + for (const [depName, depVersion] of Object.entries(targetPackage.dependencies)) { + if (rootPackage.dependencies[depName]) { + console.log(` Skipping ${depName} (already exists in root)`) + skippedCount++ + } else { + console.log(` Adding ${depName}@${depVersion}`) + rootPackage.dependencies[depName] = depVersion + addedCount++ + } + } + } else { + console.log(` No dependencies found in ${targetFile}`) + } + } + + // Write updated root package.json + writePackageJson(ROOT_PACKAGE_JSON, rootPackage) + + console.log(`\nCompleted: ${addedCount} dependencies added, ${skippedCount} skipped`) +} + +if (require.main === module) { + gatherDependencies() +}