diff --git a/README.md b/README.md
index 7fc86b4e..c0972c69 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,117 @@ craft publish 1.2.3
- **Workspace Support** - Handle monorepos with NPM/Yarn workspaces
- **CI Integration** - Wait for CI to pass, download artifacts, and publish
- **GitHub Actions** - Built-in actions for release preparation and changelog previews
+- **AI Summaries** - Summarize verbose changelog sections using AI (GitHub Models or local fallback)
+
+## AI-Powered Changelog Summaries
+
+Craft can summarize changelog sections with many entries into concise descriptions. Uses [GitHub Models](https://github.com/marketplace/models) by default, with a local fallback when no token is available.
+
+### Example 1: Craft 2.16.0
+
+**Before (6 items):**
+```markdown
+### New Features
+- Strip commit patterns from changelog entries
+- Add support for custom changelog entries from PR descriptions
+- Support for multiple entries and nested items
+- Add changelog preview action and CLI command
+- Make release workflow reusable for external repos
+- Add version templating for layer names
+```
+
+**After (section summary with expandable details):**
+```markdown
+### New Features
+Changelog entries now support custom descriptions, multiple items, previews, reusable workflows, and version templating for layers.
+
+
+Show 6 items
+
+- Strip commit patterns from changelog entries
+- Add support for custom changelog entries from PR descriptions
+- Support for multiple entries and nested items
+- Add changelog preview action and CLI command
+- Make release workflow reusable for external repos
+- Add version templating for layer names
+
+
+```
+
+**Top-level summary** (with `topLevel: "always"`):
+> The software release includes several new features: the ability to strip commit patterns from changelog entries, support for custom changelog entries derived from pull request descriptions, and support for multiple entries and nested items. Additionally, a changelog preview action and CLI command have been added.
+
+### Example 2: Sentry 25.12.0 (Large Release)
+
+For large releases like [Sentry 25.12.0](https://github.com/getsentry/sentry/releases/tag/25.12.0) with 31+ items:
+
+| Section | Items | Words In β Out | Compression |
+|---------|-------|----------------|-------------|
+| ACI | 11 | 98 β 41 | **58%** |
+| Agents | 8 | 58 β 24 | **59%** |
+| Seer & Triage | 12 | 80 β 31 | **61%** |
+
+**Top-level summary** (106 words):
+> The latest software release includes several updates across three main areas: ACI, Agents, and Seer & Triage. In the ACI section, the metric monitor form now defaults to the number of errors, and alerts have been updated to include a disabled status and display test notification errors in the UI. The Agents section introduces markdown rendering, the ability to switch to raw values, and a new onboarding process for browser JavaScript. Additionally, the Seer & Triage updates involve changes to support repo type checks, column renaming for broader applicability, and the removal of unnecessary calls.
+
+### Configuration
+
+```yaml
+aiSummaries:
+ enabled: true
+ kickInThreshold: 5 # Only summarize sections with >5 items
+ model: "openai/gpt-4o-mini" # optional, default
+ topLevel: "threshold" # "always" | "never" | "threshold" | true | false
+```
+
+#### Top-Level Summary
+
+The `topLevel` option controls whether an executive summary is generated for the entire changelog:
+
+- `"always"` or `true`: Always generate a top-level summary paragraph
+- `"never"` or `false`: Never generate a top-level summary
+- `"threshold"` (default): Only generate if total items exceed `kickInThreshold`
+
+```yaml
+# Always include an executive summary
+aiSummaries:
+ topLevel: "always"
+
+# Never include an executive summary
+aiSummaries:
+ topLevel: false
+
+# Only summarize large releases (default behavior)
+aiSummaries:
+ topLevel: "threshold"
+ kickInThreshold: 10 # Only summarize releases with >10 total items
+```
+
+### Authentication
+
+The feature uses your GitHub token automatically:
+- From `GITHUB_TOKEN` environment variable, or
+- From `gh auth token` (GitHub CLI)
+
+If no token is available, Craft falls back to a local model ([Falconsai/text_summarization](https://huggingface.co/Falconsai/text_summarization)).
+
+### Available Models
+
+**GitHub Models** (requires token):
+
+```yaml
+aiSummaries:
+ model: "openai/gpt-4o-mini" # Default, 71% compression
+ model: "openai/gpt-4o-mini" # Fast and capable
+ model: "openai/gpt-4o" # Most capable
+```
+
+**Local models** (no token needed):
+
+```yaml
+aiSummaries:
+ model: "local:Falconsai/text_summarization" # 60MB, extractive
+```
## Configuration
diff --git a/blog-post-draft.md b/blog-post-draft.md
deleted file mode 100644
index 0452cb2b..00000000
--- a/blog-post-draft.md
+++ /dev/null
@@ -1,206 +0,0 @@
-# Craft: now challenging changesets and more
-
-I've [written about the secure release infrastructure before](https://vanguard.getsentry.net/p/cmihvx6b80000isk7akkwm6s8), but this post is about something different: momentum.
-
-After being in a somewhat dormant state for a while, Craft has been getting a lot of love lately. And I mean _a lot_. Since version 2.12.0 (just about a month ago), we've shipped a flurry of releases with some pretty exciting features. Let me walk you through what's new and why I'm excited about it.
-
-## Automatic Version Bumping π―
-
-Remember the days when you had to manually decide if your release was a patch, minor, or major bump? Those days are over. Just run `craft prepare auto` and Craft analyzes your commit messages (conventional commits style) to figure out the version bump for you. If you've got a `feat:` in there, it knows it's a minor bump. A `fix:`? That's a patch. It's like having a tiny version manager living in your commits[^1].
-
-But wait, there's more flexibility here. You can also use explicit bump types:
-
-```bash
-craft prepare auto # Let Craft figure it out from commits
-craft prepare patch # Force a patch bump
-craft prepare minor # Force a minor bump
-craft prepare major # Force a major bump
-```
-
-And for teams that prefer calendar-based versioning, Craft now supports `calver` natively:
-
-```yaml
-versioning:
- policy: calver
- calver:
- format: "%y.%-m" # e.g., 24.12 for December 2024
-```
-
-The best part? When using auto-versioning, you get a preview in your PR with a "Semver Impact of This PR" section so you know exactly what _your specific change_ will do to the version.
-
-## Beautiful Changelogs πͺ·
-
-Craft now groups your changes both by main categories (like Bug Fixes and New Features) _and_ by scope within those categories. The result is a clean, organized changelog that's actually pleasant to read:
-
-```markdown
-### New Features β¨
-
-#### Api
-
-- Add user endpoint by @alice in #1
-- Add auth endpoint by @bob in #2
-
-#### Core
-
-- Improve performance by @charlie in #3
-- General improvement by @dave in #4
-```
-
-Those pesky `feat:` and `fix(scope):` prefixes? Stripped automatically. Categories appear in the order you define them. You can even override entries directly in your PR description using a `## Changelog Entry` section.
-
-### The `craft changelog` Command
-
-Want to see what the changelog will look like before you release? Now you can:
-
-```bash
-craft changelog # Preview the upcoming changelog
-craft changelog --pr 123 # See how a specific PR will appear
-craft changelog --since v2.0 # Generate changelog since a specific tag
-```
-
-### Changelog Previews Everywhere
-
-This same changelog preview now shows up automatically in your PRs _and_ in publish issues. Here's what it looks like in a publish issue:
-
-[IMAGE: changelog-preview-publish-issue.png]
-
-Contributors can see exactly how their changes will appear in the final changelog, and release managers get a clear overview of what's shipping.
-
-### Smart Revert Handling
-
-And here's a fun one: **revert handling**. When you revert a commit, Craft now understands that. If both the original and the revert are in the same release, they cancel each other out - neither appears in the changelog nor affects the version bump. If the revert is standalone (the original was in a previous release), it shows up under Bug Fixes with a patch bump. It's almost like Craft understands regret[^2]. We even handle those delightful chains of `Revert "Revert "Revert "..."` correctly. Because of course, we do that.
-
-## GitHub Actions: All-in-One π§
-
-Speaking of previews in PRs and issues - you might be wondering how that happens. We've merged the separate `action-prepare-release` repository directly into Craft. Why? Because the action was tightly coupled to Craft anyway, and maintaining them separately was creating more friction than it solved.
-
-This means you now get:
-
-1. **Reusable workflows** - Just call them from your repo, no boilerplate needed:
-
-```yaml
-# .github/workflows/release.yml
-jobs:
- release:
- uses: getsentry/craft/.github/workflows/release.yml@v2
- with:
- version: ${{ inputs.version || 'auto' }}
- secrets: inherit
-```
-
-```yaml
-# .github/workflows/changelog-preview.yml
-jobs:
- preview:
- uses: getsentry/craft/.github/workflows/changelog-preview.yml@v2
- secrets: inherit
-```
-
-2. **Proper outputs** - Get the resolved version, branch, SHA, and changelog back to use in subsequent steps
-3. **Dogfooding** - Craft now uses the latest code on master to release itself. We eat our own dog food here.
-
-For more flexibility, you can also use the composite action directly when you need custom pre/post steps.
-
-## npm Workspaces Support π¦
-
-For those of you maintaining monorepos with multiple packages, Craft now supports npm workspaces natively. This one's a game-changer for repos like sentry-javascript and sentry-wizard.
-
-Previously, sentry-javascript had to maintain a [manually curated list of 40+ npm targets](https://github.com/getsentry/sentry-javascript/blob/develop/.craft.yml) in dependency order. And that order? It was [actually incorrect](https://github.com/getsentry/sentry-javascript/pull/18429) in some places. Here's what it looked like:
-
-```yaml
-targets:
- # NPM Targets - 40+ manually curated entries in dependency order
- - name: npm
- id: '@sentry/core'
- includeNames: /^sentry-core-\d.*\.tgz$/
- - name: npm
- id: '@sentry/types'
- includeNames: /^sentry-types-\d.*\.tgz$/
- - name: npm
- id: '@sentry/node-core'
- includeNames: /^sentry-node-core-\d.*\.tgz$/
- # ... 35+ more entries ...
- - name: npm
- id: '@sentry/react-router'
- includeNames: /^sentry-react-router-\d.*\.tgz$/
-```
-
-Now? Just this:
-
-```yaml
-targets:
- - name: npm
- workspaces: true
- excludeWorkspaces: /^@sentry-internal\//
-```
-
-That's a ~200 line reduction in config, with automatic dependency ordering. Craft reads your `package.json` workspaces config, figures out the dependency graph, and publishes in the correct order.
-
-We're hoping to expand this feature to other targets like [dotnet/nuget](https://github.com/getsentry/craft/issues/649) in the future.
-
-## Docker Multi-Registry Support π³
-
-Pushing your Docker images to multiple registries? Craft now supports that out of the box. Google Artifact Registry, Docker Hub, GitHub Container Registry - push to all of them in a single `craft publish`. We even added support for regional Artifact Registry endpoints because, of course, Google had to make that complicated.
-
-## And More Quality of Life Improvements β¨
-
-We've also shipped a bunch of other improvements you've asked for, like AWS Lambda layer name templating (so you don't have to manually update layer names on major version bumps), regional Artifact Registry endpoint support, and various bug fixes.
-
-Under the hood, we've modernized the toolchain (ESLint 9, Vitest 3, Zod for schema validation) to make contributing to Craft faster and easier[^3].
-
-## New Documentation π
-
-Now you might be thinking: "How am I going to remember how to use all this awesome new stuff?" Glad you asked!
-
-We used to ~~shove~~ put everything in the README until recently, but Craft has grown into something much larger than its humble beginnings. All these new features made the need for a dedicated docs site even more urgent. So without further ado:
-
-[IMAGE: craft-docs-site.png]
-
-**[getsentry.github.io/craft](https://getsentry.github.io/craft/)** - configuration reference, target documentation, GitHub Actions guides, and more. It's all there.
-
-## Why This Matters Beyond Sentry
-
-When we first built the release infrastructure at Sentry, it was very much _for_ Sentry. But over time, Craft has evolved into something more general. It's a release management tool that doesn't care if you're shipping npm packages, PyPI wheels, Docker images, Crates, Hex packages, or AWS Lambda layers. It just works. It also nailed the fundamental release flow from the get go: prepare and then publish.
-
-### How Does Craft Compare to Changesets?
-
-If you've used [changesets](https://github.com/changesets/action), you might wonder how Craft differs. The main philosophical difference is that Craft doesn't require you to commit changelog-related files into your repo. With changesets, you need to:
-
-1. Create a changeset file for each PR (an extra step to remember)
-2. Manually specify the semver bump type in that file
-3. Commit these temporary files to your repo
-4. Remove them during release, creating churn
-
-With Craft, all that information lives where it naturally belongs: in your PR titles, descriptions, and labels. No extra files, no extra steps, no repo churn. The changelog is generated automatically from information that's already there.
-
-### Beyond Sentry
-
-With features like automatic versioning, intelligent changelog generation, revert handling, and proper GitHub Actions integration, Craft is becoming a solid option for anyone who wants a consistent, sound, and low-friction release process. And yes, that includes teams outside Sentry.
-
-Looking ahead, we want to make Craft even more accessible to the broader community. That means splitting the omnibus Docker image, and making the built-in targets more modular, so you can customize Craft for your specific needs without forking the whole thing.
-
-## Thank You π
-
-None of this would have happened without the contributions and feedback from you Sentaurs. Special thanks to:
-
-- **Miguel** (@betegon) - for code reviews, ideas, motivation
-- **Aditya** (@MathurAditya724) - for code reviews, ideas, motivation
-- **Ivana** (@sentrivana) - for code reviews, issues, and being an early adopter
-- **Hubert** (@hubertdeng123) - for code reviews and support
-- **Andrei** (@andreiborza) - for all things AWS Lambda
-- **Daniel Szoke** (@Lms24) - for code contributions, documentation, and code reviews
-- **Stefan PΓΆlz** (@Flash0ver) - for dotnet fixes and code reviews
-
-Special thanks to **Stephanie** for organizing the brownbag session in Vienna about Craft - that session was vital in getting everyone engaged and collecting valuable feedback. And to everyone who attended and shared their thoughts: your input shaped many of these improvements.
-
-## Feedback Welcome! π
-
-Here's the thingβ’: I'm genuinely excited about where Craft is heading, and I'm eager to make it better. If you've got issues - old ones, new ones, feature requests, or just complaints about that one thing that's been bugging you for years - I want to hear about them.
-
-Drop me a message, file an issue, or just leave a comment. I'm actively working on Craft and happy to tackle whatever comes up. This is the kind of infrastructure work that quietly makes everyone's life better, and I'm here for it.
-
-LFG π
-
-[^1]: It's not actually living there. That would be creepy. It just reads the messages. Still creepy? OK moving on.
-[^2]: It doesn't. But it handles reverts correctly, which is almost the same thing in software.
-[^3]: The Vitest migration alone touches ~30 test files. Don't ask me how I know this.
diff --git a/eslint.config.mjs b/eslint.config.mjs
index bfade070..2199e9a3 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -4,7 +4,7 @@ import prettier from 'eslint-config-prettier';
export default tseslint.config(
{
- ignores: ['docs/**', 'dist/**', 'node_modules/**', 'coverage/**', '*.mjs', '**/*.js'],
+ ignores: ['docs/**', 'dist/**', 'node_modules/**', 'coverage/**', '**/*.mjs', '**/*.js'],
},
eslint.configs.recommended,
...tseslint.configs.recommended,
diff --git a/package.json b/package.json
index 18c62e4a..33c3b84e 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
},
"devDependencies": {
"@aws-sdk/client-lambda": "^3.723.0",
+ "@eslint/js": "^9.17.0",
"@google-cloud/storage": "^7.14.0",
"@octokit/plugin-retry": "^7.1.2",
"@octokit/request-error": "^7.0.0",
@@ -35,9 +36,6 @@
"@types/tar": "^4.0.0",
"@types/tmp": "^0.0.33",
"@types/yargs": "^17",
- "@eslint/js": "^9.17.0",
- "typescript-eslint": "^8.18.2",
- "zod": "^3.24.1",
"async": "3.2.2",
"aws4": "^1.11.0",
"chalk": "4.1.1",
@@ -52,7 +50,6 @@
"git-url-parse": "^16.1.0",
"glob": "^11.0.0",
"is-ci": "^2.0.0",
- "vitest": "^3.0.2",
"js-yaml": "4.1.1",
"mkdirp": "^1.0.4",
"mustache": "3.0.1",
@@ -71,7 +68,11 @@
"tar": "6.2.1",
"tmp": "0.2.4",
"typescript": "^5.7.2",
- "yargs": "^18"
+ "typescript-eslint": "^8.18.2",
+ "vitest": "^3.0.2",
+ "vitest-evals": "^0.5.0",
+ "yargs": "^18",
+ "zod": "^3.24.1"
},
"scripts": {
"build:fat": "tsc -p tsconfig.build.json",
@@ -84,6 +85,7 @@
"fix": "yarn lint --fix",
"test": "vitest run",
"test:watch": "vitest",
+ "test:evals": "vitest run --config vitest.evals.config.ts",
"docs:dev": "cd docs && yarn dev",
"docs:build": "cd docs && yarn build"
},
@@ -92,6 +94,10 @@
"yarn": "1.22.19"
},
"dependencies": {
- "marked": "^17.0.1"
+ "@github/models": "^0.0.1-beta.2",
+ "@huggingface/transformers": "^3.8.1",
+ "ai": "^6.0.3",
+ "marked": "^17.0.1",
+ "node-llama-cpp": "^3.14.5"
}
}
diff --git a/src/__tests__/ai-summary.eval.ts b/src/__tests__/ai-summary.eval.ts
new file mode 100644
index 00000000..9059965f
--- /dev/null
+++ b/src/__tests__/ai-summary.eval.ts
@@ -0,0 +1,223 @@
+/**
+ * Eval tests for AI summary quality using vitest-evals.
+ *
+ * These tests use GitHub Models API to evaluate summarization quality.
+ * Requires GITHUB_TOKEN or `gh auth login`.
+ *
+ * Run: yarn test:evals
+ */
+
+import { describeEval } from 'vitest-evals';
+import { describe, afterAll } from 'vitest';
+import { summarizeItems, resetPipeline } from '../utils/ai-summary';
+
+// Test data - real changelog entries from various releases
+const TEST_CASES = [
+ {
+ input: [
+ 'Strip commit patterns from changelog entries',
+ 'Add support for custom changelog entries from PR descriptions',
+ 'Support for multiple entries and nested items',
+ 'Add changelog preview action and CLI command',
+ 'Make release workflow reusable for external repos',
+ 'Add version templating for layer names',
+ ],
+ // Keywords that should appear in the summary
+ expectedKeywords: ['changelog', 'preview', 'workflow'],
+ description: 'Craft 2.16.0 New Features',
+ },
+ {
+ input: [
+ 'Add dark mode toggle to settings',
+ 'Implement new dashboard widgets',
+ 'Add user preferences panel',
+ 'Create notification center',
+ 'Build analytics overview page',
+ 'Add keyboard shortcuts support',
+ ],
+ // Allow semantic equivalents
+ expectedKeywords: ['dark mode', 'widget', 'notification'],
+ description: 'UI Features',
+ },
+ {
+ input: [
+ 'Fix memory leak in connection pool',
+ 'Handle null pointer in parser',
+ 'Correct timezone handling for DST',
+ 'Fix race condition in async handler',
+ 'Resolve deadlock in worker threads',
+ 'Fix buffer overflow in decoder',
+ ],
+ // Allow semantic equivalents: memory/leak, fix/address/resolve, concurrency/race
+ expectedKeywords: ['memory', 'error', 'concurren'],
+ description: 'Bug Fixes',
+ },
+];
+
+/**
+ * Custom scorer: checks if summary contains expected keywords
+ */
+const KeywordScorer = async ({
+ output,
+ expected,
+}: {
+ output: string;
+ expected: string[];
+}) => {
+ if (!output || !expected) {
+ return { score: 0, metadata: { reason: 'Missing output or expected' } };
+ }
+
+ const outputLower = output.toLowerCase();
+ const found = expected.filter(kw => outputLower.includes(kw.toLowerCase()));
+ const score = found.length / expected.length;
+
+ return {
+ score,
+ metadata: {
+ found,
+ missing: expected.filter(kw => !outputLower.includes(kw.toLowerCase())),
+ total: expected.length,
+ },
+ };
+};
+
+/**
+ * Custom scorer: checks if output is a proper sentence
+ */
+const SentenceFormatScorer = async ({ output }: { output: string }) => {
+ if (!output) {
+ return { score: 0, metadata: { reason: 'Empty output' } };
+ }
+
+ const checks = {
+ startsWithCapital: /^[A-Z]/.test(output),
+ endsWithPunctuation: /[.!?]$/.test(output),
+ notBulletList: !output.includes('\n-') && !output.includes('\nβ’'),
+ notNumberedList: !/^\d+\.\s/.test(output),
+ reasonableLength: output.length > 20 && output.length < 500,
+ };
+
+ const passed = Object.values(checks).filter(Boolean).length;
+ const score = passed / Object.keys(checks).length;
+
+ return {
+ score,
+ metadata: checks,
+ };
+};
+
+/**
+ * Custom scorer: checks if summary is more concise than input
+ */
+const ConcisenessScorer = async ({
+ input,
+ output,
+}: {
+ input: string[];
+ output: string;
+}) => {
+ if (!output || !input) {
+ return { score: 0, metadata: { reason: 'Missing data' } };
+ }
+
+ const inputWords = input.join(' ').split(/\s+/).length;
+ const outputWords = output.split(/\s+/).length;
+
+ const ratio = outputWords / inputWords;
+ let score: number;
+
+ // For true summarization, we expect significant compression
+ if (ratio < 0.3) {
+ score = 1.0; // Excellent compression
+ } else if (ratio <= 0.5) {
+ score = 0.9; // Good compression
+ } else if (ratio <= 0.7) {
+ score = 0.7; // Acceptable compression
+ } else if (ratio <= 1.0) {
+ score = 0.5; // Minimal compression
+ } else {
+ score = 0.2; // Expanded instead of summarized
+ }
+
+ return {
+ score,
+ metadata: {
+ inputWords,
+ outputWords,
+ ratio: ratio.toFixed(2),
+ compressionPercent: `${((1 - ratio) * 100).toFixed(0)}%`,
+ },
+ };
+};
+
+// Check token availability at module load time
+const apiAvailable = !!process.env.GITHUB_TOKEN;
+
+describe('AI Summary Evals', () => {
+ afterAll(() => {
+ resetPipeline();
+ });
+
+ describeEval('Keyword Coverage', {
+ skipIf: () => !apiAvailable,
+
+ data: async () =>
+ TEST_CASES.map(tc => ({
+ input: tc.input,
+ expected: tc.expectedKeywords,
+ metadata: { description: tc.description },
+ })),
+
+ task: async (input: string[]) => {
+ const result = await summarizeItems(input, { kickInThreshold: 0 });
+ return result || '';
+ },
+
+ scorers: [KeywordScorer],
+
+ // At least 1 of 3 keywords should be present
+ // LLM may use semantic equivalents, so we're lenient here
+ threshold: 0.3,
+ });
+
+ describeEval('Sentence Format', {
+ skipIf: () => !apiAvailable,
+
+ data: async () =>
+ TEST_CASES.map(tc => ({
+ input: tc.input,
+ metadata: { description: tc.description },
+ })),
+
+ task: async (input: string[]) => {
+ const result = await summarizeItems(input, { kickInThreshold: 0 });
+ return result || '';
+ },
+
+ scorers: [SentenceFormatScorer],
+
+ // Output should pass most format checks
+ threshold: 0.8,
+ });
+
+ describeEval('Conciseness', {
+ skipIf: () => !apiAvailable,
+
+ data: async () =>
+ TEST_CASES.map(tc => ({
+ input: tc.input,
+ metadata: { description: tc.description },
+ })),
+
+ task: async (input: string[]) => {
+ const result = await summarizeItems(input, { kickInThreshold: 0 });
+ return result || '';
+ },
+
+ scorers: [ConcisenessScorer],
+
+ // Should achieve good compression
+ threshold: 0.7,
+ });
+});
diff --git a/src/__tests__/ai-summary.integration.test.ts b/src/__tests__/ai-summary.integration.test.ts
new file mode 100644
index 00000000..f3ed998e
--- /dev/null
+++ b/src/__tests__/ai-summary.integration.test.ts
@@ -0,0 +1,319 @@
+/**
+ * Integration tests for AI summarization with real changelog data.
+ * Uses Sentry 25.12.0 release notes as test data.
+ * @see https://github.com/getsentry/sentry/releases/tag/25.12.0
+ *
+ * Run with: GITHUB_TOKEN=... yarn test ai-summary.integration
+ */
+import { describe, expect, test } from 'vitest';
+
+import {
+ DEFAULT_KICK_IN_THRESHOLD,
+ summarizeItems,
+ summarizeChangelog,
+ shouldGenerateTopLevel,
+ type AiSummariesConfig,
+} from '../utils/ai-summary';
+
+// Sample sections from Sentry 25.12.0 release
+const SENTRY_25_12_SECTIONS = {
+ 'ACI (11 items)': [
+ 'feat(aci): Metric monitor form should default to number of errors',
+ 'feat(aci): add disabled alert to error/metric monitors and alerts',
+ 'feat(aci): show test notification errors in UI',
+ 'feat(aci): Always redirect from alerts when clicking from notification',
+ "feat(aci): Add 'open in' button to issue details",
+ 'feat(aci): Add an open in explore button to metric detector charts',
+ 'feat(aci): Add contributing issues section to metric issue',
+ 'feat(aci): Add detector config to issues created by detectors',
+ 'feat(aci): Add option to send workflow evaluation logs directly to Sentry',
+ 'feat(aci): Add simpler UX for connecting alerts to a project',
+ 'feat(aci): Add metric issue event details',
+ ],
+
+ 'Agents (8 items)': [
+ 'feat(agents): Render markdown and allow switching to raw values',
+ 'feat(agents): Preserve icon on spans with error',
+ 'feat(agents): Add browser js onboarding',
+ 'feat(ai-insights): move analytics event to event timeseries',
+ 'feat(analytics): Add Seer feature tracking to issue_details.seer_opened event',
+ 'feat(anomaly): add seer anomaly thresholds to metric monitor graph',
+ 'feat(attribute-distributions): parallelize stats query',
+ 'feat(auth): Bring back SPA auth page, remove deprecated props',
+ ],
+
+ 'Autofix (4 items)': [
+ 'feat(autofix): Add backend check to disable autofix if repos are not connected',
+ 'feat(autofix): add UI for explorer-backed agent',
+ 'feat(autofix): migrate to explorer agent',
+ 'feat(autofix): Add email-based user mapping for Seer Autofix PR review requests',
+ ],
+
+ 'Billing (5 items)': [
+ 'feat(billing): Migrate chart functions to use DATA_CATEGORY_INFO formatting',
+ 'feat(billing): Add-on product trials in _admin',
+ 'feat(billing): Add formatting configuration to DATA_CATEGORY_INFO formatting',
+ 'feat(billing): Add formatting configuration to DATA_CATEGORY_INFO',
+ 'feat(billing): Add hook for product billing access',
+ ],
+
+ 'Seer & Triage (12 items)': [
+ 'chore(seer): Update check for support repo types by looking at repo.id',
+ 'chore(seer): Rename column to be more general for other agent types',
+ 'chore(seer): Tag method name for seer rpcs',
+ 'chore(seer): codeowner for tests',
+ 'chore(seer): Remove extra calls to invalidateQueries',
+ 'chore(seer onboarding): Set api owner of OrganizationSeerOnboardingCheck',
+ 'chore(seer rpc): Register search agent rpcs',
+ 'chore(seer rpc): Add missing endpoints',
+ 'chore(triage signals): Set org level default to medium too',
+ 'chore(triage signals): Log cleanup',
+ 'ref(seer): Tweak Seer org settings page',
+ 'ref(explorer): issues rpc revamp',
+ ],
+
+ 'Replay (4 items)': [
+ 'chore(replay): add feature flag for granular replay permissions',
+ 'refactor(replay): update replay components to use linkQuery for navigation',
+ 'refactor(replay): remove unused components in platform icons',
+ 'refactor(replay): shrink top header buttons to xs',
+ ],
+};
+
+const hasGitHubToken = !!process.env.GITHUB_TOKEN;
+
+describe.skipIf(!hasGitHubToken)(
+ 'AI Summary Integration - Sentry 25.12.0',
+ () => {
+ const config: AiSummariesConfig = {
+ enabled: true,
+ kickInThreshold: DEFAULT_KICK_IN_THRESHOLD,
+ };
+
+ test.each(Object.entries(SENTRY_25_12_SECTIONS))(
+ 'summarizes %s',
+ async (sectionName, items) => {
+ const result = await summarizeItems(items, config);
+ const inputWords = items.join(' ').split(/\s+/).length;
+
+ if (items.length <= DEFAULT_KICK_IN_THRESHOLD) {
+ // Sections with β€5 items should be skipped
+ expect(result).toBeNull();
+ } else {
+ // Sections with >5 items should be summarized
+ expect(result).toBeTruthy();
+ expect(typeof result).toBe('string');
+
+ // Should achieve meaningful compression
+ const outputWords = result!.split(/\s+/).length;
+ const compressionRatio = outputWords / inputWords;
+
+ console.log(`\nπ ${sectionName}`);
+ console.log(` Input: ${items.length} items, ${inputWords} words`);
+ console.log(
+ ` Output: ${outputWords} words (${Math.round((1 - compressionRatio) * 100)}% compression)`
+ );
+ console.log(` Summary: "${result}"`);
+
+ // Expect at least 30% compression for large sections
+ expect(compressionRatio).toBeLessThan(0.7);
+ }
+ },
+ { timeout: 30000 }
+ );
+
+ test('respects threshold - skips small sections', async () => {
+ const smallSection = SENTRY_25_12_SECTIONS['Autofix (4 items)'];
+ expect(smallSection.length).toBeLessThanOrEqual(
+ DEFAULT_KICK_IN_THRESHOLD
+ );
+
+ const result = await summarizeItems(smallSection, config);
+ expect(result).toBeNull();
+ });
+
+ test('summarizes large sections', async () => {
+ const largeSection = SENTRY_25_12_SECTIONS['ACI (11 items)'];
+ expect(largeSection.length).toBeGreaterThan(DEFAULT_KICK_IN_THRESHOLD);
+
+ const result = await summarizeItems(largeSection, config);
+ expect(result).toBeTruthy();
+ expect(typeof result).toBe('string');
+
+ // Should be prose, not bullet points
+ expect(result).not.toContain('feat(aci)');
+ });
+ }
+);
+
+// Craft 2.16.0 sections for top-level summary testing
+const CRAFT_2_16_SECTIONS = {
+ 'New Features': [
+ 'Strip commit patterns from changelog entries',
+ 'Add support for custom changelog entries from PR descriptions',
+ 'Support for multiple entries and nested items',
+ 'Add changelog preview action and CLI command',
+ 'Make release workflow reusable for external repos',
+ 'Add version templating for layer names',
+ ],
+};
+
+// Sentry 25.12.0 sections without prefixes for top-level testing
+const SENTRY_CLEAN_SECTIONS = {
+ ACI: [
+ 'Metric monitor form should default to number of errors',
+ 'Add disabled alert to error/metric monitors and alerts',
+ 'Show test notification errors in UI',
+ 'Always redirect from alerts when clicking from notification',
+ 'Add open in button to issue details',
+ 'Add an open in explore button to metric detector charts',
+ 'Add contributing issues section to metric issue',
+ 'Add detector config to issues created by detectors',
+ 'Add option to send workflow evaluation logs directly to Sentry',
+ 'Add simpler UX for connecting alerts to a project',
+ 'Add metric issue event details',
+ ],
+ Agents: [
+ 'Render markdown and allow switching to raw values',
+ 'Preserve icon on spans with error',
+ 'Add browser js onboarding',
+ 'Move analytics event to event timeseries',
+ 'Add Seer feature tracking to issue_details.seer_opened event',
+ 'Add seer anomaly thresholds to metric monitor graph',
+ 'Parallelize stats query',
+ 'Bring back SPA auth page, remove deprecated props',
+ ],
+ 'Seer & Triage': [
+ 'Update check for support repo types by looking at repo.id',
+ 'Rename column to be more general for other agent types',
+ 'Tag method name for seer rpcs',
+ 'Codeowner for tests',
+ 'Remove extra calls to invalidateQueries',
+ 'Set api owner of OrganizationSeerOnboardingCheck',
+ 'Register search agent rpcs',
+ 'Add missing endpoints',
+ 'Set org level default to medium too',
+ 'Log cleanup',
+ 'Tweak Seer org settings page',
+ 'Issues rpc revamp',
+ ],
+};
+
+describe.skipIf(!hasGitHubToken)(
+ 'AI Summary Integration - Top-Level Summary',
+ () => {
+ describe('shouldGenerateTopLevel', () => {
+ test('returns true for large releases with threshold mode', () => {
+ const totalItems = Object.values(SENTRY_CLEAN_SECTIONS).flat().length;
+ expect(totalItems).toBe(31);
+ expect(shouldGenerateTopLevel(totalItems, { topLevel: 'threshold' })).toBe(true);
+ });
+
+ test('returns false for small releases with threshold mode', () => {
+ expect(shouldGenerateTopLevel(5, { topLevel: 'threshold' })).toBe(false);
+ });
+
+ test('returns true with always mode regardless of size', () => {
+ expect(shouldGenerateTopLevel(1, { topLevel: 'always' })).toBe(true);
+ expect(shouldGenerateTopLevel(1, { topLevel: true })).toBe(true);
+ });
+
+ test('returns false with never mode regardless of size', () => {
+ expect(shouldGenerateTopLevel(100, { topLevel: 'never' })).toBe(false);
+ expect(shouldGenerateTopLevel(100, { topLevel: false })).toBe(false);
+ });
+ });
+
+ describe('summarizeChangelog', () => {
+ test(
+ 'generates top-level summary for Craft 2.16.0',
+ async () => {
+ const result = await summarizeChangelog(CRAFT_2_16_SECTIONS, {
+ topLevel: 'always',
+ });
+
+ expect(result).toBeTruthy();
+ expect(typeof result).toBe('string');
+
+ // Should be a paragraph, not bullet points
+ expect(result).not.toMatch(/^[-*β’]/m);
+
+ // Should be reasonably sized (1-5 sentences)
+ const sentences = result!.split(/[.!?]+/).filter(s => s.trim());
+ expect(sentences.length).toBeGreaterThanOrEqual(1);
+ expect(sentences.length).toBeLessThanOrEqual(7);
+
+ console.log('\nπ Craft 2.16.0 Top-Level Summary');
+ console.log(` Items: ${Object.values(CRAFT_2_16_SECTIONS).flat().length}`);
+ console.log(` Summary: "${result}"`);
+ },
+ { timeout: 30000 }
+ );
+
+ test(
+ 'generates top-level summary for Sentry 25.12.0',
+ async () => {
+ const result = await summarizeChangelog(SENTRY_CLEAN_SECTIONS, {
+ topLevel: 'always',
+ });
+
+ expect(result).toBeTruthy();
+ expect(typeof result).toBe('string');
+
+ // Should mention key themes
+ const summary = result!.toLowerCase();
+ const hasRelevantContent =
+ summary.includes('aci') ||
+ summary.includes('agent') ||
+ summary.includes('seer') ||
+ summary.includes('monitor') ||
+ summary.includes('error') ||
+ summary.includes('update') ||
+ summary.includes('feature') ||
+ summary.includes('enhance');
+ expect(hasRelevantContent).toBe(true);
+
+ // Should be a proper paragraph
+ const wordCount = result!.split(/\s+/).length;
+ expect(wordCount).toBeGreaterThan(20);
+ expect(wordCount).toBeLessThan(150);
+
+ console.log('\nπ Sentry 25.12.0 Top-Level Summary');
+ console.log(` Items: ${Object.values(SENTRY_CLEAN_SECTIONS).flat().length}`);
+ console.log(` Words: ${wordCount}`);
+ console.log(` Summary: "${result}"`);
+ },
+ { timeout: 30000 }
+ );
+
+ test(
+ 'respects threshold mode - skips small releases',
+ async () => {
+ const smallSections = {
+ 'Bug Fixes': ['Fix A', 'Fix B', 'Fix C'],
+ };
+
+ const result = await summarizeChangelog(smallSections, {
+ topLevel: 'threshold',
+ kickInThreshold: 5,
+ });
+
+ expect(result).toBeNull();
+ },
+ { timeout: 30000 }
+ );
+
+ test(
+ 'respects never mode - skips even large releases',
+ async () => {
+ const result = await summarizeChangelog(SENTRY_CLEAN_SECTIONS, {
+ topLevel: 'never',
+ });
+
+ expect(result).toBeNull();
+ },
+ { timeout: 30000 }
+ );
+ });
+ }
+);
diff --git a/src/__tests__/ai-summary.test.ts b/src/__tests__/ai-summary.test.ts
new file mode 100644
index 00000000..d4bdf028
--- /dev/null
+++ b/src/__tests__/ai-summary.test.ts
@@ -0,0 +1,398 @@
+/**
+ * Tests for AI summary functionality
+ * - GitHub Models API (primary, abstractive summarization)
+ * - Local Hugging Face model (fallback, extractive summarization)
+ */
+
+import { describe, test, expect, beforeEach, vi, afterEach } from 'vitest';
+
+// Mock child_process for gh auth token
+vi.mock('child_process', () => ({
+ execSync: vi.fn().mockReturnValue('mock-github-token\n'),
+}));
+
+// Mock the AI SDK
+let mockGenerateTextResponse =
+ 'Enhanced changelog with new features and improvements.';
+let shouldGenerateFail = false;
+
+vi.mock('ai', () => ({
+ generateText: vi.fn().mockImplementation(() => {
+ if (shouldGenerateFail) {
+ return Promise.reject(new Error('API error'));
+ }
+ return Promise.resolve({ text: mockGenerateTextResponse });
+ }),
+}));
+
+vi.mock('@github/models', () => ({
+ githubModels: vi.fn().mockReturnValue({ modelId: 'mock-model' }),
+}));
+
+// Mock Hugging Face transformers for local fallback
+let mockLocalSummary =
+ 'Add support for custom entries. Make release workflow reusable.';
+let shouldLocalFail = false;
+
+vi.mock('@huggingface/transformers', () => ({
+ pipeline: vi.fn().mockImplementation(() => {
+ if (shouldLocalFail) {
+ return Promise.reject(new Error('Local model error'));
+ }
+ return Promise.resolve(async () => [{ summary_text: mockLocalSummary }]);
+ }),
+}));
+
+// Import after mocking
+import {
+ summarizeSection,
+ summarizeItems,
+ summarizeChangelog,
+ shouldGenerateTopLevel,
+ formatSummaryWithDetails,
+ isAiSummaryAvailable,
+ resetPipeline,
+ DEFAULT_KICK_IN_THRESHOLD,
+ DEFAULT_AI_MODEL,
+ LOCAL_FALLBACK_MODEL,
+ getModelInfo,
+ type AiSummariesConfig,
+} from '../utils/ai-summary';
+
+describe('ai-summary', () => {
+ const originalEnv = process.env;
+
+ beforeEach(() => {
+ process.env = { ...originalEnv };
+ shouldGenerateFail = false;
+ shouldLocalFail = false;
+ mockGenerateTextResponse =
+ 'Enhanced changelog with new features and improvements.';
+ mockLocalSummary =
+ 'Add support for custom entries. Make release workflow reusable.';
+ resetPipeline();
+ });
+
+ afterEach(() => {
+ process.env = originalEnv;
+ });
+
+ describe('constants', () => {
+ test('DEFAULT_KICK_IN_THRESHOLD is 5', () => {
+ expect(DEFAULT_KICK_IN_THRESHOLD).toBe(5);
+ });
+
+ test('DEFAULT_AI_MODEL uses Ministral-3b', () => {
+ expect(DEFAULT_AI_MODEL).toBe('openai/gpt-4o-mini');
+ });
+
+ test('LOCAL_FALLBACK_MODEL uses Falconsai', () => {
+ expect(LOCAL_FALLBACK_MODEL).toBe('Falconsai/text_summarization');
+ });
+ });
+
+ describe('getModelInfo', () => {
+ test('returns default model when no config', () => {
+ expect(getModelInfo()).toBe('openai/gpt-4o-mini');
+ });
+
+ test('returns custom model from config', () => {
+ const config: AiSummariesConfig = { model: 'openai/gpt-4o-mini' };
+ expect(getModelInfo(config)).toBe('openai/gpt-4o-mini');
+ });
+ });
+
+ describe('summarizeItems', () => {
+ test('returns null for empty array', async () => {
+ const result = await summarizeItems([]);
+ expect(result).toBeNull();
+ });
+
+ test('returns null for items at threshold', async () => {
+ const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'];
+ expect(items.length).toBe(DEFAULT_KICK_IN_THRESHOLD);
+ const result = await summarizeItems(items);
+ expect(result).toBeNull();
+ });
+
+ test('returns summary for items above threshold', async () => {
+ const items = ['A', 'B', 'C', 'D', 'E', 'F']; // 6 items > threshold
+ const result = await summarizeItems(items);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+
+ test('respects custom kickInThreshold', async () => {
+ const items = ['A', 'B', 'C']; // 3 items
+ const config: AiSummariesConfig = { kickInThreshold: 2 };
+ const result = await summarizeItems(items, config);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+
+ test('returns null when enabled is false', async () => {
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const config: AiSummariesConfig = { enabled: false };
+ const result = await summarizeItems(items, config);
+ expect(result).toBeNull();
+ });
+
+ test('falls back to local model when GitHub API fails', async () => {
+ shouldGenerateFail = true;
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const result = await summarizeItems(items);
+ expect(result).toBe(mockLocalSummary);
+ });
+
+ test('falls back to local model when no GitHub token', async () => {
+ delete process.env.GITHUB_TOKEN;
+ const childProcess = await import('child_process');
+ vi.mocked(childProcess.execSync).mockImplementationOnce(() => {
+ throw new Error('gh not found');
+ });
+
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const result = await summarizeItems(items);
+ expect(result).toBe(mockLocalSummary);
+ });
+
+ test('uses local model when explicitly configured', async () => {
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const config: AiSummariesConfig = {
+ model: 'local:Falconsai/text_summarization',
+ };
+ const result = await summarizeItems(items, config);
+ expect(result).toBe(mockLocalSummary);
+ });
+
+ test('returns null when both API and local fail', async () => {
+ shouldGenerateFail = true;
+ shouldLocalFail = true;
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const result = await summarizeItems(items);
+ expect(result).toBeNull();
+ });
+
+ test('uses GITHUB_TOKEN from env', async () => {
+ process.env.GITHUB_TOKEN = 'env-token';
+ const items = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const result = await summarizeItems(items);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+ });
+
+ describe('summarizeSection (legacy)', () => {
+ test('returns null for empty text', async () => {
+ const result = await summarizeSection('');
+ expect(result).toBeNull();
+ });
+
+ test('returns null for very short text', async () => {
+ const result = await summarizeSection('Short');
+ expect(result).toBeNull();
+ });
+
+ test('extracts items from bullet points', async () => {
+ const text = `
+ - Item 1
+ - Item 2
+ - Item 3
+ - Item 4
+ - Item 5
+ - Item 6
+ `;
+ const result = await summarizeSection(text);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+ });
+
+ describe('isAiSummaryAvailable', () => {
+ test('returns true (always available with local fallback)', async () => {
+ const result = await isAiSummaryAvailable();
+ expect(result).toBe(true);
+ });
+ });
+
+ describe('resetPipeline', () => {
+ test('does not throw', () => {
+ expect(() => resetPipeline()).not.toThrow();
+ });
+ });
+
+ describe('shouldGenerateTopLevel', () => {
+ test('returns false when enabled is false', () => {
+ const config: AiSummariesConfig = { enabled: false };
+ expect(shouldGenerateTopLevel(10, config)).toBe(false);
+ });
+
+ test('returns true when topLevel is "always"', () => {
+ const config: AiSummariesConfig = { topLevel: 'always' };
+ expect(shouldGenerateTopLevel(1, config)).toBe(true);
+ });
+
+ test('returns true when topLevel is true', () => {
+ const config: AiSummariesConfig = { topLevel: true };
+ expect(shouldGenerateTopLevel(1, config)).toBe(true);
+ });
+
+ test('returns false when topLevel is "never"', () => {
+ const config: AiSummariesConfig = { topLevel: 'never' };
+ expect(shouldGenerateTopLevel(100, config)).toBe(false);
+ });
+
+ test('returns false when topLevel is false', () => {
+ const config: AiSummariesConfig = { topLevel: false };
+ expect(shouldGenerateTopLevel(100, config)).toBe(false);
+ });
+
+ test('defaults to "threshold" behavior', () => {
+ // No topLevel specified, should use threshold
+ expect(shouldGenerateTopLevel(5, {})).toBe(false); // At threshold
+ expect(shouldGenerateTopLevel(6, {})).toBe(true); // Above threshold
+ });
+
+ test('topLevel "threshold" uses kickInThreshold value', () => {
+ const config: AiSummariesConfig = {
+ topLevel: 'threshold',
+ kickInThreshold: 10,
+ };
+ expect(shouldGenerateTopLevel(10, config)).toBe(false); // At threshold
+ expect(shouldGenerateTopLevel(11, config)).toBe(true); // Above threshold
+ });
+ });
+
+ describe('summarizeChangelog', () => {
+ const sampleSections = {
+ 'New Features': ['Feature A', 'Feature B', 'Feature C'],
+ 'Bug Fixes': ['Fix X', 'Fix Y', 'Fix Z'],
+ };
+
+ test('returns null when enabled is false', async () => {
+ const config: AiSummariesConfig = { enabled: false };
+ const result = await summarizeChangelog(sampleSections, config);
+ expect(result).toBeNull();
+ });
+
+ test('returns null when topLevel is "never"', async () => {
+ const config: AiSummariesConfig = { topLevel: 'never' };
+ const result = await summarizeChangelog(sampleSections, config);
+ expect(result).toBeNull();
+ });
+
+ test('returns null when at or below threshold (default)', async () => {
+ const smallSections = {
+ 'New Features': ['Feature A', 'Feature B'],
+ 'Bug Fixes': ['Fix X', 'Fix Y', 'Fix Z'],
+ }; // 5 total items = threshold
+ const config: AiSummariesConfig = { topLevel: 'threshold' };
+ const result = await summarizeChangelog(smallSections, config);
+ expect(result).toBeNull();
+ });
+
+ test('returns summary when topLevel is "always"', async () => {
+ const config: AiSummariesConfig = { topLevel: 'always' };
+ const result = await summarizeChangelog(sampleSections, config);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+
+ test('returns summary when above threshold', async () => {
+ const largeSections = {
+ 'New Features': ['A', 'B', 'C', 'D'],
+ 'Bug Fixes': ['X', 'Y', 'Z'],
+ }; // 7 total items > 5 threshold
+ const config: AiSummariesConfig = { topLevel: 'threshold' };
+ const result = await summarizeChangelog(largeSections, config);
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+
+ test('uses custom threshold', async () => {
+ const config: AiSummariesConfig = {
+ topLevel: 'threshold',
+ kickInThreshold: 2,
+ };
+ const result = await summarizeChangelog(sampleSections, config);
+ // 6 items > 2 threshold
+ expect(result).toBe(
+ 'Enhanced changelog with new features and improvements.',
+ );
+ });
+
+ test('falls back to local model on API failure', async () => {
+ shouldGenerateFail = true;
+ const config: AiSummariesConfig = { topLevel: 'always' };
+ const result = await summarizeChangelog(sampleSections, config);
+ expect(result).toBe(mockLocalSummary);
+ });
+ });
+
+ describe('formatSummaryWithDetails', () => {
+ const originalItems = [
+ '- Feature A by @user1 in #123',
+ '- Feature B by @user2 in #124',
+ '- Feature C by @user3 in #125',
+ ];
+
+ test('returns original items when no summary', () => {
+ const result = formatSummaryWithDetails(null, originalItems);
+ expect(result).toBe(originalItems.join('\n'));
+ });
+
+ test('returns original items when empty array and summary', () => {
+ const result = formatSummaryWithDetails('Some summary', []);
+ expect(result).toBe('');
+ });
+
+ test('wraps items in details when summary provided', () => {
+ const summary = 'Added three new features for better UX.';
+ const result = formatSummaryWithDetails(summary, originalItems);
+
+ expect(result).toContain(summary);
+ expect(result).toContain('');
+ expect(result).toContain(' ');
+ expect(result).toContain('Show 3 items');
+ expect(result).toContain('- Feature A by @user1 in #123');
+ expect(result).toContain('- Feature B by @user2 in #124');
+ expect(result).toContain('- Feature C by @user3 in #125');
+ });
+
+ test('uses singular "item" for single item', () => {
+ const summary = 'Added a feature.';
+ const result = formatSummaryWithDetails(summary, ['- Feature A']);
+
+ expect(result).toContain('Show 1 item');
+ });
+
+ test('places summary before details block', () => {
+ const summary = 'Added three features.';
+ const result = formatSummaryWithDetails(summary, originalItems);
+
+ const summaryIndex = result.indexOf(summary);
+ const detailsIndex = result.indexOf('');
+
+ expect(summaryIndex).toBeLessThan(detailsIndex);
+ });
+
+ test('preserves original item formatting', () => {
+ const items = [
+ '- **Bold** item',
+ '- Item with `code`',
+ '- [Link](https://example.com)',
+ ];
+ const result = formatSummaryWithDetails('Summary text.', items);
+
+ expect(result).toContain('- **Bold** item');
+ expect(result).toContain('- Item with `code`');
+ expect(result).toContain('- [Link](https://example.com)');
+ });
+ });
+});
diff --git a/src/__tests__/config.test.ts b/src/__tests__/config.test.ts
index 4f7ad4c8..bfb6f47e 100644
--- a/src/__tests__/config.test.ts
+++ b/src/__tests__/config.test.ts
@@ -46,6 +46,19 @@ describe('validateConfiguration', () => {
expect(validateConfiguration(data)).toEqual(data);
});
+ test('parses configuration with changelog aiSummary', () => {
+ const data = {
+ changelog: {
+ policy: 'auto',
+ aiSummary: {
+ enabled: true,
+ },
+ },
+ };
+
+ expect(validateConfiguration(data)).toEqual(data);
+ });
+
test('parses configuration with versioning', () => {
const data = {
versioning: {
@@ -95,4 +108,18 @@ describe('CraftProjectConfigSchema', () => {
const result = CraftProjectConfigSchema.safeParse(data);
expect(result.success).toBe(false);
});
+
+ test('schema validates changelog with aiSummary', () => {
+ const data = {
+ changelog: {
+ policy: 'auto',
+ aiSummary: {
+ enabled: true,
+ },
+ },
+ };
+
+ const result = CraftProjectConfigSchema.safeParse(data);
+ expect(result.success).toBe(true);
+ });
});
diff --git a/src/config.ts b/src/config.ts
index 23124f87..44391f17 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -412,6 +412,11 @@ export interface NormalizedChangelogConfig {
policy: ChangelogPolicy;
/** Whether to group entries by conventional commit scope */
scopeGrouping: boolean;
+ /** AI summary configuration */
+ aiSummary: {
+ /** Whether AI summary is enabled */
+ enabled: boolean;
+ };
}
const DEFAULT_CHANGELOG_FILE_PATH = 'CHANGELOG.md';
@@ -438,6 +443,9 @@ export function getChangelogConfig(): NormalizedChangelogConfig {
policy = config.changelogPolicy;
}
+ // AI summary - enabled by default when policy is 'auto'
+ let aiSummaryEnabled = false;
+
// Handle changelog config
if (config.changelog !== undefined) {
if (typeof config.changelog === 'string') {
@@ -454,13 +462,26 @@ export function getChangelogConfig(): NormalizedChangelogConfig {
if (config.changelog.scopeGrouping !== undefined) {
scopeGrouping = config.changelog.scopeGrouping;
}
+ if (config.changelog.aiSummary?.enabled !== undefined) {
+ aiSummaryEnabled = config.changelog.aiSummary.enabled;
+ }
}
}
+ // Default: AI summary enabled when policy is 'auto' (unless explicitly disabled)
+ if (config.changelog === undefined || typeof config.changelog === 'string') {
+ aiSummaryEnabled = policy === ChangelogPolicy.Auto;
+ } else if (config.changelog.aiSummary?.enabled === undefined) {
+ aiSummaryEnabled = policy === ChangelogPolicy.Auto;
+ }
+
return {
filePath,
policy,
scopeGrouping,
+ aiSummary: {
+ enabled: aiSummaryEnabled,
+ },
};
}
diff --git a/src/schemas/projectConfig.schema.ts b/src/schemas/projectConfig.schema.ts
new file mode 100644
index 00000000..fe9481ac
--- /dev/null
+++ b/src/schemas/projectConfig.schema.ts
@@ -0,0 +1,232 @@
+/**
+ * We store JSON-schema for project configuration in the TS file, so it is
+ * properly seen and copied by TS-compiler.
+ */
+
+const projectConfigJsonSchema = {
+ title: 'CraftProjectConfig',
+ description: 'Craft project-specific configuration',
+ type: 'object',
+ properties: {
+ github: {
+ title: 'GitHubGlobalConfig',
+ description: 'Global (non-target!) GitHub configuration for the project',
+ type: 'object',
+ properties: {
+ owner: {
+ type: 'string',
+ },
+ repo: {
+ type: 'string',
+ },
+ // TODO(byk): This is now obsolete, only in-place to keep bw compat
+ // deprecate and remove?
+ projectPath: {
+ type: 'string',
+ },
+ },
+ additionalProperties: false,
+ required: ['owner', 'repo'],
+ },
+ targets: {
+ type: 'array',
+ items: { $ref: '#/definitions/targetConfig' },
+ },
+ preReleaseCommand: { type: 'string' },
+ postReleaseCommand: { type: 'string' },
+ releaseBranchPrefix: { type: 'string' },
+ changelog: {
+ title: 'ChangelogConfig',
+ description: 'Changelog configuration options',
+ oneOf: [
+ // Legacy: string path to changelog file
+ { type: 'string' },
+ // New: grouped configuration object
+ {
+ type: 'object',
+ properties: {
+ policy: { $ref: '#/definitions/changelogPolicy' },
+ path: {
+ type: 'string',
+ description: 'Path to the changelog file',
+ },
+ },
+ additionalProperties: false,
+ },
+ ],
+ },
+ // Legacy alias for changelog.policy (deprecated)
+ changelogPolicy: { $ref: '#/definitions/changelogPolicy' },
+ minVersion: {
+ type: 'string',
+ pattern: '^\\d+\\.\\d+\\.\\d+.*$',
+ },
+ requireNames: {
+ type: 'array',
+ items: { type: 'string' },
+ },
+ statusProvider: {
+ title: 'BaseStatusProvider',
+ description: 'Which service should be used for status checks',
+ type: 'object',
+ properties: {
+ name: {
+ title: 'StatusProviderName',
+ description: 'Name of the status provider',
+ type: 'string',
+ enum: ['github'],
+ tsEnumNames: ['GitHub'],
+ },
+ config: {
+ type: 'object',
+ },
+ },
+ additionalProperties: false,
+ required: ['name'],
+ },
+ artifactProvider: {
+ title: 'BaseArtifactProvider',
+ description: 'Which service should be used for artifact storage',
+ type: 'object',
+ properties: {
+ name: {
+ title: 'ArtifactProviderName',
+ description: 'Name of the artifact provider',
+ type: 'string',
+ enum: ['gcs', 'github', 'none'],
+ tsEnumNames: ['GCS', 'GitHub', 'None'],
+ },
+ config: {
+ type: 'object',
+ },
+ },
+ additionalProperties: false,
+ required: ['name'],
+ },
+ aiSummaries: {
+ title: 'AiSummariesConfig',
+ description:
+ 'AI-powered changelog summarization. Uses GitHub Models API by default, falls back to local model.',
+ type: 'object',
+ properties: {
+ enabled: {
+ type: 'boolean',
+ description: 'Enable AI-powered summaries (default: true)',
+ default: true,
+ },
+ kickInThreshold: {
+ type: 'integer',
+ minimum: 1,
+ description:
+ 'Number of items in a section before AI summarization kicks in (default: 5)',
+ default: 5,
+ },
+ model: {
+ type: 'string',
+ description:
+ 'Model to use. GitHub Models: "openai/gpt-4o-mini" (default), "openai/gpt-4o". Local: "local:Falconsai/text_summarization". Falls back to local model if no GITHUB_TOKEN.',
+ },
+ topLevel: {
+ oneOf: [
+ { type: 'boolean' },
+ { type: 'string', enum: ['always', 'never', 'threshold'] },
+ ],
+ description:
+ 'Top-level summary for entire changelog. "always"/true: always generate, "never"/false: never generate, "threshold": only if total items > kickInThreshold (default: "threshold")',
+ default: 'threshold',
+ },
+ },
+ additionalProperties: false,
+ },
+ },
+ additionalProperties: false,
+
+ definitions: {
+ changelogPolicy: {
+ title: 'ChangelogPolicy',
+ description: 'Different policies for changelog management',
+ type: 'string',
+ enum: ['auto', 'simple', 'none'],
+ tsEnumNames: ['Auto', 'Simple', 'None'],
+ },
+ targetConfig: {
+ title: 'TargetConfig',
+ description: 'Generic target configuration',
+ type: 'object',
+ properties: {
+ name: {
+ type: 'string',
+ },
+ id: {
+ type: 'string',
+ },
+ includeNames: {
+ type: 'string',
+ },
+ excludeNames: {
+ type: 'string',
+ },
+ },
+ required: ['name'],
+ },
+
+ /**
+ * FIXME: these definitions are NOT used at the moment.
+ * Reason: referencing (extending) targetConfig definition results into
+ * duplicated TargetConfig interfaces in the TS file.
+ *
+ * e.g.
+ *
+ * interface GitHubTargetConfig extends TargetConfig {}
+ *
+ * and
+ *
+ * interface NpmTargetConfig extends TargetConfig1 {}
+ *
+ * ...where TargetConfig and TargetConfig1 have the same definition.
+ *
+ * Related GitHub tickets:
+ * https://github.com/bcherny/json-schema-to-typescript/issues/142
+ * https://github.com/bcherny/json-schema-to-typescript/issues/56
+ * https://github.com/bcherny/json-schema-to-typescript/issues/132
+ *
+ */
+ githubConfig: {
+ title: 'GitHubTargetConfig',
+ description: 'Configuration options for the GitHub target',
+ extends: { $ref: '#/definitions/targetConfig' },
+ properties: {
+ changelog: {
+ type: 'string',
+ },
+ name: { type: 'string', enum: ['github'] },
+ },
+ required: ['name'],
+ additionalProperties: false,
+ },
+ npmConfig: {
+ title: 'NpmTargetConfig',
+ description: 'Configuration options for the NPM target',
+ extends: { $ref: '#/definitions/targetConfig' },
+ properties: {
+ access: {
+ type: 'string',
+ },
+ },
+ additionalProperties: false,
+ },
+ cratesConfig: {
+ title: 'CratesTargetConfig',
+ description: 'Configuration options for the Crates target',
+ extends: { $ref: '#/definitions/targetConfig' },
+ properties: {
+ noDevDeps: {
+ type: 'boolean',
+ },
+ },
+ additionalProperties: false,
+ },
+ },
+};
+
+module.exports = projectConfigJsonSchema;
diff --git a/src/schemas/project_config.ts b/src/schemas/project_config.ts
index eae22834..2a2904ca 100644
--- a/src/schemas/project_config.ts
+++ b/src/schemas/project_config.ts
@@ -109,6 +109,18 @@ export const VersioningConfigSchema = z.object({
export type VersioningConfig = z.infer;
+/**
+ * AI summary configuration
+ */
+export const AiSummaryConfigSchema = z.object({
+ /**
+ * Whether to enable AI-powered summaries for changelog sections
+ */
+ enabled: z.boolean().optional(),
+});
+
+export type AiSummaryConfig = z.infer;
+
/**
* Changelog configuration
*/
@@ -118,9 +130,12 @@ export const ChangelogConfigSchema = z.union([
filePath: z.string().optional(),
policy: z.enum(['auto', 'simple', 'none']).optional(),
scopeGrouping: z.boolean().optional(),
+ aiSummary: AiSummaryConfigSchema.optional(),
}),
]);
+export type ChangelogConfig = z.infer;
+
/**
* Craft project-specific configuration
*/
diff --git a/src/utils/ai-summary.ts b/src/utils/ai-summary.ts
new file mode 100644
index 00000000..f4340da9
--- /dev/null
+++ b/src/utils/ai-summary.ts
@@ -0,0 +1,437 @@
+import { logger } from '../logger';
+
+/**
+ * Default threshold for AI summarization.
+ * Sections with more items than this will be summarized.
+ */
+export const DEFAULT_KICK_IN_THRESHOLD = 5;
+
+/**
+ * Default model for summarization via GitHub Models API.
+ * Ministral-3b provides the best compression (71%) while being fast.
+ */
+export const DEFAULT_AI_MODEL = 'openai/gpt-4o-mini';
+
+/**
+ * Local fallback model when no GitHub token is available.
+ * Falconsai provides extractive summarization (~48% compression).
+ */
+export const LOCAL_FALLBACK_MODEL = 'Falconsai/text_summarization';
+
+/**
+ * Top-level summary configuration options.
+ * - "always" or true: Always generate top-level summary
+ * - "never" or false: Never generate top-level summary
+ * - "threshold": Only generate if total items exceed kickInThreshold
+ */
+export type TopLevelSummaryOption =
+ | 'always'
+ | 'never'
+ | 'threshold'
+ | boolean;
+
+/**
+ * Configuration options for AI summarization.
+ * Maps to the `aiSummaries` config block in .craft.yml
+ */
+export interface AiSummariesConfig {
+ /**
+ * Enable AI-powered summaries. Default: true
+ */
+ enabled?: boolean;
+
+ /**
+ * Number of items before AI summarization kicks in. Default: 5
+ */
+ kickInThreshold?: number;
+
+ /**
+ * Model to use for summarization.
+ * - GitHub Models: "mistral-ai/ministral-3b", "openai/gpt-4o-mini", etc.
+ * - Local: "local:Falconsai/text_summarization"
+ * Default: openai/gpt-4o-mini (requires GITHUB_TOKEN)
+ */
+ model?: string;
+
+ /**
+ * Top-level overall summary configuration.
+ * - "always" or true: Always generate top-level summary
+ * - "never" or false: Never generate top-level summary
+ * - "threshold": Only generate if total items exceed kickInThreshold
+ * Default: "threshold"
+ */
+ topLevel?: TopLevelSummaryOption;
+}
+
+// Cached local summarizer pipeline
+let localSummarizer: any = null;
+
+/**
+ * Gets the GitHub token for API authentication.
+ * Tries GITHUB_TOKEN env var first, then falls back to `gh auth token`.
+ */
+async function getGitHubToken(): Promise {
+ // Check environment variable first
+ if (process.env.GITHUB_TOKEN) {
+ return process.env.GITHUB_TOKEN;
+ }
+
+ // Try gh CLI
+ try {
+ const { execSync } = await import('child_process');
+ const token = execSync('gh auth token', {
+ encoding: 'utf-8',
+ stdio: ['pipe', 'pipe', 'pipe'],
+ }).trim();
+ return token || null;
+ } catch {
+ return null;
+ }
+}
+
+/**
+ * Summarizes using GitHub Models API (abstractive, high quality).
+ */
+async function summarizeWithGitHubModels(
+ items: string[],
+ modelName: string,
+ token: string
+): Promise {
+ const { generateText } = await import('ai');
+ const { githubModels } = await import('@github/models');
+
+ const model = githubModels(modelName, { apiKey: token });
+
+ const itemsList = items.map((item, i) => `${i + 1}. ${item}`).join('\n');
+ const inputWordCount = items.join(' ').split(/\s+/).length;
+ const targetWords = Math.max(15, Math.floor(inputWordCount * 0.4));
+
+ const { text } = await generateText({
+ model,
+ prompt: `Summarize these ${items.length} changelog items into ONE neutral, factual sentence of approximately ${targetWords} words. Group related changes by theme. Be informative, not promotional - avoid words like "enhanced", "improved", "significant", or "powerful". Simply state what changed.
+
+Items:
+${itemsList}
+
+Summary (${targetWords} words max, neutral tone):`,
+ maxTokens: 60,
+ temperature: 0.3,
+ });
+
+ return text.trim() || null;
+}
+
+/**
+ * Summarizes using local Hugging Face model (extractive, no token needed).
+ */
+async function summarizeWithLocalModel(
+ items: string[],
+ modelName: string
+): Promise {
+ // Lazy load the pipeline
+ if (!localSummarizer) {
+ logger.info(`Loading local AI model: ${modelName}`);
+ logger.info('First run may take a minute to download (~60MB)...');
+
+ const { pipeline } = await import('@huggingface/transformers');
+ localSummarizer = await pipeline('summarization', modelName);
+ }
+
+ const text = items.join('. ') + '.';
+ const result = await localSummarizer(text, {
+ max_length: 60,
+ min_length: 15,
+ });
+
+ return result[0]?.summary_text?.trim() || null;
+}
+
+/**
+ * Summarizes a list of changelog items into a concise description.
+ *
+ * Uses GitHub Models API by default for high-quality abstractive summarization.
+ * Falls back to local Hugging Face model if no GitHub token is available.
+ *
+ * @param items - Array of changelog item descriptions
+ * @param config - Optional AI summaries configuration
+ * @returns Condensed summary, or null if below threshold or disabled
+ */
+export async function summarizeItems(
+ items: string[],
+ config?: AiSummariesConfig
+): Promise {
+ // Check if enabled (default: true)
+ if (config?.enabled === false) {
+ return null;
+ }
+
+ const threshold = config?.kickInThreshold ?? DEFAULT_KICK_IN_THRESHOLD;
+
+ // Don't summarize if at or below threshold
+ if (!items || items.length <= threshold) {
+ return null;
+ }
+
+ const requestedModel = config?.model ?? DEFAULT_AI_MODEL;
+
+ // Check if explicitly requesting local model
+ const isLocalModel = requestedModel.startsWith('local:');
+ const modelName = isLocalModel
+ ? requestedModel.slice(6)
+ : requestedModel;
+
+ try {
+ if (isLocalModel) {
+ // Use local model explicitly
+ logger.debug(`Using local model: ${modelName}`);
+ return await summarizeWithLocalModel(items, modelName);
+ }
+
+ // Try GitHub Models API first
+ const token = await getGitHubToken();
+
+ if (token) {
+ logger.debug(`Using GitHub Models: ${modelName}`);
+ return await summarizeWithGitHubModels(items, modelName, token);
+ }
+
+ // No token - fall back to local model
+ logger.debug(
+ 'No GitHub token found, falling back to local model'
+ );
+ return await summarizeWithLocalModel(items, LOCAL_FALLBACK_MODEL);
+ } catch (error: any) {
+ logger.warn('AI summarization failed:', error?.message || error);
+
+ // If GitHub Models failed, try local fallback
+ if (!isLocalModel) {
+ try {
+ logger.debug('Trying local fallback model...');
+ return await summarizeWithLocalModel(items, LOCAL_FALLBACK_MODEL);
+ } catch (fallbackError: any) {
+ logger.warn(
+ 'Local fallback also failed:',
+ fallbackError?.message || fallbackError
+ );
+ }
+ }
+
+ return null;
+ }
+}
+
+/**
+ * Legacy function for backwards compatibility.
+ */
+export async function summarizeSection(
+ text: string,
+ config?: AiSummariesConfig
+): Promise {
+ if (!text || text.trim().length < 50) {
+ return null;
+ }
+
+ const items = text
+ .split('\n')
+ .map(line => line.replace(/^[-*β’]\s*/, '').trim())
+ .filter(Boolean);
+
+ return summarizeItems(items, config);
+}
+
+/**
+ * Checks if AI summarization is available.
+ * Returns true if GitHub token exists or local model can be used.
+ */
+export async function isAiSummaryAvailable(): Promise {
+ // Always available - falls back to local model
+ return true;
+}
+
+/**
+ * Resets the cached pipeline (useful for tests).
+ */
+export function resetPipeline(): void {
+ localSummarizer = null;
+}
+
+/**
+ * Gets info about the configured model.
+ */
+export function getModelInfo(config?: AiSummariesConfig): string {
+ return config?.model ?? DEFAULT_AI_MODEL;
+}
+
+/**
+ * Formats a summary with original items in an expandable details block.
+ * When a summary is provided, it shows the summary followed by a collapsed
+ * details section containing the original items.
+ *
+ * @param summary - The AI-generated summary (or null if summarization was skipped)
+ * @param originalItems - The original changelog items as formatted markdown lines
+ * @returns Formatted markdown with optional details block
+ */
+export function formatSummaryWithDetails(
+ summary: string | null,
+ originalItems: string[]
+): string {
+ if (!summary || originalItems.length === 0) {
+ // No summary - just return original items as-is
+ return originalItems.join('\n');
+ }
+
+ // Summary exists - show it with original items in a collapsible details block
+ const itemCount = originalItems.length;
+ const detailsLabel = `Show ${itemCount} item${itemCount !== 1 ? 's' : ''}`;
+
+ return `${summary}
+
+
+${detailsLabel}
+
+${originalItems.join('\n')}
+
+ `;
+}
+
+/**
+ * Normalizes the topLevel config value to a consistent format.
+ */
+function normalizeTopLevel(
+ topLevel: TopLevelSummaryOption | undefined
+): 'always' | 'never' | 'threshold' {
+ if (topLevel === true || topLevel === 'always') {
+ return 'always';
+ }
+ if (topLevel === false || topLevel === 'never') {
+ return 'never';
+ }
+ // Default to 'threshold'
+ return 'threshold';
+}
+
+/**
+ * Checks if a top-level summary should be generated based on config and item count.
+ */
+export function shouldGenerateTopLevel(
+ totalItems: number,
+ config?: AiSummariesConfig
+): boolean {
+ if (config?.enabled === false) {
+ return false;
+ }
+
+ const topLevel = normalizeTopLevel(config?.topLevel);
+
+ switch (topLevel) {
+ case 'always':
+ return true;
+ case 'never':
+ return false;
+ case 'threshold': {
+ const threshold = config?.kickInThreshold ?? DEFAULT_KICK_IN_THRESHOLD;
+ return totalItems > threshold;
+ }
+ }
+}
+
+/**
+ * Generates a top-level summary for the entire changelog.
+ * Creates a single paragraph with up to 5 sentences summarizing all changes.
+ *
+ * @param sections - Map of section names to their items
+ * @param config - Optional AI summaries configuration
+ * @returns A paragraph summary, or null if disabled/below threshold
+ */
+export async function summarizeChangelog(
+ sections: Record,
+ config?: AiSummariesConfig
+): Promise {
+ // Check if enabled
+ if (config?.enabled === false) {
+ return null;
+ }
+
+ // Count total items
+ const totalItems = Object.values(sections).reduce(
+ (sum, items) => sum + items.length,
+ 0
+ );
+
+ // Check if we should generate based on topLevel setting
+ if (!shouldGenerateTopLevel(totalItems, config)) {
+ return null;
+ }
+
+ const requestedModel = config?.model ?? DEFAULT_AI_MODEL;
+ const isLocalModel = requestedModel.startsWith('local:');
+ const modelName = isLocalModel ? requestedModel.slice(6) : requestedModel;
+
+ // Build a structured summary of all sections
+ const sectionSummaries = Object.entries(sections)
+ .filter(([_, items]) => items.length > 0)
+ .map(([name, items]) => `${name}: ${items.slice(0, 5).join('; ')}${items.length > 5 ? ` (+${items.length - 5} more)` : ''}`)
+ .join('\n');
+
+ try {
+ if (isLocalModel) {
+ // Local model - just summarize the section summaries
+ return await summarizeWithLocalModel(
+ sectionSummaries.split('\n'),
+ modelName
+ );
+ }
+
+ const token = await getGitHubToken();
+
+ if (token) {
+ const { generateText } = await import('ai');
+ const { githubModels } = await import('@github/models');
+
+ const model = githubModels(modelName, { apiKey: token });
+
+ const { text } = await generateText({
+ model,
+ prompt: `Write a brief, neutral summary (1 paragraph, maximum 5 sentences) of this software release. List the main areas of change without promotional language - avoid words like "enhanced", "improved", "significant", "powerful", or "exciting". Simply state what was added, changed, or fixed.
+
+Changelog sections:
+${sectionSummaries}
+
+Total changes: ${totalItems} items across ${Object.keys(sections).length} sections.
+
+Summary (neutral, factual tone):`,
+ maxTokens: 150,
+ temperature: 0.3,
+ });
+
+ return text.trim() || null;
+ }
+
+ // Fallback to local model
+ logger.debug('No GitHub token found, falling back to local model');
+ return await summarizeWithLocalModel(
+ sectionSummaries.split('\n'),
+ LOCAL_FALLBACK_MODEL
+ );
+ } catch (error: any) {
+ logger.warn('Top-level summarization failed:', error?.message || error);
+
+ // If GitHub Models failed and not explicitly using local model, try local fallback
+ if (!isLocalModel) {
+ try {
+ logger.debug('Trying local fallback model for top-level summary...');
+ return await summarizeWithLocalModel(
+ sectionSummaries.split('\n'),
+ LOCAL_FALLBACK_MODEL
+ );
+ } catch (fallbackError: any) {
+ logger.warn(
+ 'Local fallback also failed:',
+ fallbackError?.message || fallbackError
+ );
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/vitest.evals.config.ts b/vitest.evals.config.ts
new file mode 100644
index 00000000..e5f74e21
--- /dev/null
+++ b/vitest.evals.config.ts
@@ -0,0 +1,16 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ include: ['src/**/*.eval.ts'],
+ // Evals may take longer due to model inference
+ testTimeout: 60000,
+ // Run evals sequentially to avoid model conflicts
+ pool: 'forks',
+ poolOptions: {
+ forks: {
+ singleFork: true,
+ },
+ },
+ },
+});
diff --git a/yarn.lock b/yarn.lock
index 71a11346..aee13dc5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,55 @@
# yarn lockfile v1
+"@ai-sdk/gateway@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/gateway/-/gateway-3.0.2.tgz#0a345ae3c7cf6e9533936dcba2fb7a4664131f19"
+ integrity sha512-giJEg9ob45htbu3iautK+2kvplY2JnTj7ir4wZzYSQWvqGatWfBBfDuNCU5wSJt9BCGjymM5ZS9ziD42JGCZBw==
+ dependencies:
+ "@ai-sdk/provider" "3.0.0"
+ "@ai-sdk/provider-utils" "4.0.1"
+ "@vercel/oidc" "3.0.5"
+
+"@ai-sdk/openai-compatible@beta":
+ version "2.0.0-beta.60"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.0-beta.60.tgz#dc452ed588ec73842aadb9c25b4d3f2b15fe35bf"
+ integrity sha512-WCs4dzulFbK2qlWGb6em98DVdrAUSlOfBkTfLWnp4hMdJRYwAwzAc6uzQvSjtrZ8FCqiQqiHb2wrueFt9U/RPQ==
+ dependencies:
+ "@ai-sdk/provider" "3.0.0-beta.32"
+ "@ai-sdk/provider-utils" "4.0.0-beta.59"
+
+"@ai-sdk/provider-utils@4.0.0-beta.59", "@ai-sdk/provider-utils@beta":
+ version "4.0.0-beta.59"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider-utils/-/provider-utils-4.0.0-beta.59.tgz#3a91f88bfd9d02dd4f24b098e8e309f2f3fde444"
+ integrity sha512-Ide+xB/kMT54cEC0o8vKwtdL+YVzdpOtwYIDo11y7BOU4PYZUtT0F+IpfwxuLx+P1uMCPtz6pNZvCRIgCdVoig==
+ dependencies:
+ "@ai-sdk/provider" "3.0.0-beta.32"
+ "@standard-schema/spec" "^1.1.0"
+ eventsource-parser "^3.0.6"
+
+"@ai-sdk/provider-utils@4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider-utils/-/provider-utils-4.0.1.tgz#6102fe98138021cd7196b2cdc1ce33f7f956426b"
+ integrity sha512-de2v8gH9zj47tRI38oSxhQIewmNc+OZjYIOOaMoVWKL65ERSav2PYYZHPSPCrfOeLMkv+Dyh8Y0QGwkO29wMWQ==
+ dependencies:
+ "@ai-sdk/provider" "3.0.0"
+ "@standard-schema/spec" "^1.1.0"
+ eventsource-parser "^3.0.6"
+
+"@ai-sdk/provider@3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider/-/provider-3.0.0.tgz#de5b60ae8570177604048e79edf4a032c92851e6"
+ integrity sha512-m9ka3ptkPQbaHHZHqDXDF9C9B5/Mav0KTdky1k2HZ3/nrW2t1AgObxIVPyGDWQNS9FXT/FS6PIoSjpcP/No8rQ==
+ dependencies:
+ json-schema "^0.4.0"
+
+"@ai-sdk/provider@3.0.0-beta.32", "@ai-sdk/provider@beta":
+ version "3.0.0-beta.32"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider/-/provider-3.0.0-beta.32.tgz#5b71fc925ece233a9e84ec9e8cdb4ee75561ddfd"
+ integrity sha512-JWYyFAWiGRkB8lkKykPPmV+s2fwjApvOQ7vuf2lNWuPJGOWIBXQy3SBrNxhgPZwkm8QquKuPtB+LILT2PisE4w==
+ dependencies:
+ json-schema "^0.4.0"
+
"@apm-js-collab/code-transformer@^0.8.0":
version "0.8.2"
resolved "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz"
@@ -474,6 +523,13 @@
resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz#b00f7d6aedfe832ef6c84488f3a422cce6a47efa"
integrity sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==
+"@emnapi/runtime@^1.7.0":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.1.tgz#a73784e23f5d57287369c808197288b52276b791"
+ integrity sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==
+ dependencies:
+ tslib "^2.4.0"
+
"@esbuild/aix-ppc64@0.25.12":
version "0.25.12"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c"
@@ -821,6 +877,15 @@
reflect-metadata "^0.1.12"
tslib "^1.8.1"
+"@github/models@^0.0.1-beta.2":
+ version "0.0.1-beta.2"
+ resolved "https://registry.yarnpkg.com/@github/models/-/models-0.0.1-beta.2.tgz#618ebcd181438fbd375967e2193e4bcc2db21c7a"
+ integrity sha512-x/FhB/ZE/BUydyBoo+dDtob6ujr5+KG/+chlFF0zJqI4HllMHYGzOsVp0sHGiQGNY67itYijWlycehZ6Dnr2rw==
+ dependencies:
+ "@ai-sdk/openai-compatible" beta
+ "@ai-sdk/provider" beta
+ "@ai-sdk/provider-utils" beta
+
"@google-cloud/paginator@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-5.0.2.tgz#86ad773266ce9f3b82955a8f75e22cd012ccc889"
@@ -860,6 +925,21 @@
teeny-request "^9.0.0"
uuid "^8.0.0"
+"@huggingface/jinja@^0.5.3":
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.5.3.tgz#8182a2d6fc9f84c1539fa12c219a5915cdc41264"
+ integrity sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA==
+
+"@huggingface/transformers@^3.8.1":
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/@huggingface/transformers/-/transformers-3.8.1.tgz#317da003865322396796173223eeaaf0f9723f0a"
+ integrity sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==
+ dependencies:
+ "@huggingface/jinja" "^0.5.3"
+ onnxruntime-node "1.21.0"
+ onnxruntime-web "1.22.0-dev.20250409-89f8206ba4"
+ sharp "^0.34.1"
+
"@humanfs/core@^0.19.1":
version "0.19.1"
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
@@ -883,6 +963,153 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
+"@img/colour@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@img/colour/-/colour-1.0.0.tgz#d2fabb223455a793bf3bf9c70de3d28526aa8311"
+ integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==
+
+"@img/sharp-darwin-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz#6e0732dcade126b6670af7aa17060b926835ea86"
+ integrity sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==
+ optionalDependencies:
+ "@img/sharp-libvips-darwin-arm64" "1.2.4"
+
+"@img/sharp-darwin-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz#19bc1dd6eba6d5a96283498b9c9f401180ee9c7b"
+ integrity sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==
+ optionalDependencies:
+ "@img/sharp-libvips-darwin-x64" "1.2.4"
+
+"@img/sharp-libvips-darwin-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz#2894c0cb87d42276c3889942e8e2db517a492c43"
+ integrity sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==
+
+"@img/sharp-libvips-darwin-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz#e63681f4539a94af9cd17246ed8881734386f8cc"
+ integrity sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==
+
+"@img/sharp-libvips-linux-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz#b1b288b36864b3bce545ad91fa6dadcf1a4ad318"
+ integrity sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==
+
+"@img/sharp-libvips-linux-arm@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz#b9260dd1ebe6f9e3bdbcbdcac9d2ac125f35852d"
+ integrity sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==
+
+"@img/sharp-libvips-linux-ppc64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz#4b83ecf2a829057222b38848c7b022e7b4d07aa7"
+ integrity sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==
+
+"@img/sharp-libvips-linux-riscv64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz#880b4678009e5a2080af192332b00b0aaf8a48de"
+ integrity sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==
+
+"@img/sharp-libvips-linux-s390x@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz#74f343c8e10fad821b38f75ced30488939dc59ec"
+ integrity sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==
+
+"@img/sharp-libvips-linux-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz#df4183e8bd8410f7d61b66859a35edeab0a531ce"
+ integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==
+
+"@img/sharp-libvips-linuxmusl-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz#c8d6b48211df67137541007ee8d1b7b1f8ca8e06"
+ integrity sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==
+
+"@img/sharp-libvips-linuxmusl-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz#be11c75bee5b080cbee31a153a8779448f919f75"
+ integrity sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==
+
+"@img/sharp-linux-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz#7aa7764ef9c001f15e610546d42fce56911790cc"
+ integrity sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-arm64" "1.2.4"
+
+"@img/sharp-linux-arm@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz#5fb0c3695dd12522d39c3ff7a6bc816461780a0d"
+ integrity sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-arm" "1.2.4"
+
+"@img/sharp-linux-ppc64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz#9c213a81520a20caf66978f3d4c07456ff2e0813"
+ integrity sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-ppc64" "1.2.4"
+
+"@img/sharp-linux-riscv64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz#cdd28182774eadbe04f62675a16aabbccb833f60"
+ integrity sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-riscv64" "1.2.4"
+
+"@img/sharp-linux-s390x@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz#93eac601b9f329bb27917e0e19098c722d630df7"
+ integrity sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-s390x" "1.2.4"
+
+"@img/sharp-linux-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz#55abc7cd754ffca5002b6c2b719abdfc846819a8"
+ integrity sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-x64" "1.2.4"
+
+"@img/sharp-linuxmusl-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz#d6515ee971bb62f73001a4829b9d865a11b77086"
+ integrity sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==
+ optionalDependencies:
+ "@img/sharp-libvips-linuxmusl-arm64" "1.2.4"
+
+"@img/sharp-linuxmusl-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz#d97978aec7c5212f999714f2f5b736457e12ee9f"
+ integrity sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==
+ optionalDependencies:
+ "@img/sharp-libvips-linuxmusl-x64" "1.2.4"
+
+"@img/sharp-wasm32@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz#2f15803aa626f8c59dd7c9d0bbc766f1ab52cfa0"
+ integrity sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==
+ dependencies:
+ "@emnapi/runtime" "^1.7.0"
+
+"@img/sharp-win32-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz#3706e9e3ac35fddfc1c87f94e849f1b75307ce0a"
+ integrity sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==
+
+"@img/sharp-win32-ia32@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz#0b71166599b049e032f085fb9263e02f4e4788de"
+ integrity sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==
+
+"@img/sharp-win32-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8"
+ integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==
+
"@isaacs/balanced-match@^4.0.1":
version "4.0.1"
resolved "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz"
@@ -907,6 +1134,13 @@
wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+"@isaacs/fs-minipass@^4.0.0":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32"
+ integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==
+ dependencies:
+ minipass "^7.0.4"
+
"@jridgewell/sourcemap-codec@^1.5.5":
version "1.5.5"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
@@ -924,11 +1158,148 @@
resolved "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz"
integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==
+"@node-llama-cpp/linux-arm64@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-arm64/-/linux-arm64-3.14.5.tgz#4f4bacbbb6a8e63a37b2a4eb04ecf405ee5fe816"
+ integrity sha512-58IcWW7EOqc/66mYWXRsoMCy1MR3pTX/YaC0HYF9Rg5XeAPKhUP7NHrglbqgjO62CkcuFZaSEiX2AtG972GQYQ==
+
+"@node-llama-cpp/linux-armv7l@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-armv7l/-/linux-armv7l-3.14.5.tgz#5cc2107df6ff75e95ef7be600c9b34d5f0fd9483"
+ integrity sha512-mJWN0qWsn8y+r/34DC3XlSiXjjKs6wX1BTx0wwJ37fWefS/qfzuBJwQGqpfqe5xpfafib/RgQX44fsvE/9yb1w==
+
+"@node-llama-cpp/linux-x64-cuda-ext@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-x64-cuda-ext/-/linux-x64-cuda-ext-3.14.5.tgz#1d56b790a15a94998551bdce4e634c864aec0fec"
+ integrity sha512-AACXmXjqvAppoC6Z20UI7yeSZaFb6uP9x/2lzctVwlm42ef76SN6DNXaX1yzH7DTyzK5zYhoH4ycJUe+zOeGzw==
+
+"@node-llama-cpp/linux-x64-cuda@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-x64-cuda/-/linux-x64-cuda-3.14.5.tgz#f4df15d0982687ab3b8f99cb3489750b87ad4d1f"
+ integrity sha512-yk0EGnAJ+m/paSaItigmxcqC8nNjZlkx9yZgQE51CsTip7tmnqqlj60pW1fWmhrjOJ9XnRlVVTP81fa9B+O1Hg==
+
+"@node-llama-cpp/linux-x64-vulkan@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-x64-vulkan/-/linux-x64-vulkan-3.14.5.tgz#4775df2629ad591e30d241506f00c9cd086fc168"
+ integrity sha512-9wZG90CUyyO8EsqfDEh03/fK0ctbQFbKaAFa6Goh+jFLOtqPL+plLqAsW3jDFdLRF5+oAPTKt9/4Y7vHTajQbQ==
+
+"@node-llama-cpp/linux-x64@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/linux-x64/-/linux-x64-3.14.5.tgz#abbedc4025304408d690315f4ccc8d3778ef09a6"
+ integrity sha512-f6xCqlSqSxMP9Iwm3CpaTzFybbHrzpLkNzA18v21PwhMN8u4DP44euLoxe+BMbOpyzx4iMxU1AUsPsgcHD1Y4w==
+
+"@node-llama-cpp/mac-arm64-metal@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/mac-arm64-metal/-/mac-arm64-metal-3.14.5.tgz#ee0dfff00ced460b2514840216d4c5017612fe7b"
+ integrity sha512-7pclj/nbQyx7gPVbyqkCn+ftlGcnw7YrewxBv1/BWWAMzBrMt2+qkjtUcUhwXH7mT5WN/+eWsszhIMXH3Uf6vQ==
+
+"@node-llama-cpp/mac-x64@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/mac-x64/-/mac-x64-3.14.5.tgz#3fb534ebf2e218a92dd289b9dc06b4681dbcd5f7"
+ integrity sha512-iZBmLgPkLKiKS0lYAuqq8i85etGeQ9L+AjEJUhG5N6T/vCF4XSOkUTsEFMEX+iJLV3VxvY/C8R1e/UF7InUjUg==
+
+"@node-llama-cpp/win-arm64@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/win-arm64/-/win-arm64-3.14.5.tgz#3fe9ed66a0d91a160dea66d317255867d1624b49"
+ integrity sha512-WTZJeb2JZo/qPNHf++xA2YeMXB46G7G4WsKEnHVyCpAhhslHAhe/LPgSQfNfk9rYusbsRiy9QMxeGNSOowZMVQ==
+
+"@node-llama-cpp/win-x64-cuda-ext@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/win-x64-cuda-ext/-/win-x64-cuda-ext-3.14.5.tgz#6e0534a7bfd43ceee3e80ea64d2094ce09878f63"
+ integrity sha512-kBHnUmodr+n8N+sKTh1c6aNNEmvXBWM5AtaLWIEfkCb00bVHNFeqYPmLuPNtMX3dIUtD9PHdA4Jsn0RJmNZJfA==
+
+"@node-llama-cpp/win-x64-cuda@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/win-x64-cuda/-/win-x64-cuda-3.14.5.tgz#4d4036ce1f8b374d5606d7b3c080b2762210e11d"
+ integrity sha512-gwBMSzUteLD765Gq/hYQ4UC21vggR7oG+DU4zAg0Mt3i34PqKJC+tBop5jsTN5Hq8RaM9+nTNrVbF/x228TLvg==
+
+"@node-llama-cpp/win-x64-vulkan@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/win-x64-vulkan/-/win-x64-vulkan-3.14.5.tgz#68763690566f316b2e350741d4cefc5ec0240791"
+ integrity sha512-rY+vr5RaGSCWEe22WZMkhUu16o9zpeqTZO/nD5G27Y0bb+xBRDLmXbxYMp2dDQTfpkNWIZ0ia3PGWwl5yhYw7A==
+
+"@node-llama-cpp/win-x64@3.14.5":
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/@node-llama-cpp/win-x64/-/win-x64-3.14.5.tgz#473c92b555ff8997d2d3aaf316e56bdb5ae44a63"
+ integrity sha512-cEuhb1iLTodM+V8xc1mWKeWRYkX9tlnl0+9jUjwsv2kgnAjEob3WlTYsCXewvEe2ShSyk8AsLsBPZxv7IQaBsw==
+
+"@octokit/app@^16.1.2":
+ version "16.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/app/-/app-16.1.2.tgz#2077a19e55c984408e2d74b9f7dd397870eac0df"
+ integrity sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==
+ dependencies:
+ "@octokit/auth-app" "^8.1.2"
+ "@octokit/auth-unauthenticated" "^7.0.3"
+ "@octokit/core" "^7.0.6"
+ "@octokit/oauth-app" "^8.0.3"
+ "@octokit/plugin-paginate-rest" "^14.0.0"
+ "@octokit/types" "^16.0.0"
+ "@octokit/webhooks" "^14.0.0"
+
+"@octokit/auth-app@^8.1.2":
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.1.2.tgz#68f2ce201c525dc678965c50b377963b3bce135f"
+ integrity sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw==
+ dependencies:
+ "@octokit/auth-oauth-app" "^9.0.3"
+ "@octokit/auth-oauth-user" "^6.0.2"
+ "@octokit/request" "^10.0.6"
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+ toad-cache "^3.7.0"
+ universal-github-app-jwt "^2.2.0"
+ universal-user-agent "^7.0.0"
+
+"@octokit/auth-oauth-app@^9.0.2", "@octokit/auth-oauth-app@^9.0.3":
+ version "9.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz#7d7f55e0aea5b207a5c75e1db81385b0dd25113a"
+ integrity sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==
+ dependencies:
+ "@octokit/auth-oauth-device" "^8.0.3"
+ "@octokit/auth-oauth-user" "^6.0.2"
+ "@octokit/request" "^10.0.6"
+ "@octokit/types" "^16.0.0"
+ universal-user-agent "^7.0.0"
+
+"@octokit/auth-oauth-device@^8.0.3":
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz#d4b6a5d99c9c2365be1c11702d70668035a976be"
+ integrity sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==
+ dependencies:
+ "@octokit/oauth-methods" "^6.0.2"
+ "@octokit/request" "^10.0.6"
+ "@octokit/types" "^16.0.0"
+ universal-user-agent "^7.0.0"
+
+"@octokit/auth-oauth-user@^6.0.1", "@octokit/auth-oauth-user@^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz#7ec9d2102a7680f2af0ebe2a96d8ad08a1634513"
+ integrity sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==
+ dependencies:
+ "@octokit/auth-oauth-device" "^8.0.3"
+ "@octokit/oauth-methods" "^6.0.2"
+ "@octokit/request" "^10.0.6"
+ "@octokit/types" "^16.0.0"
+ universal-user-agent "^7.0.0"
+
"@octokit/auth-token@^5.0.0":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.2.tgz#68a486714d7a7fd1df56cb9bc89a860a0de866de"
integrity sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==
+"@octokit/auth-token@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53"
+ integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==
+
+"@octokit/auth-unauthenticated@^7.0.2", "@octokit/auth-unauthenticated@^7.0.3":
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz#48a469dcb6676f152fb06d24049f02de87e23993"
+ integrity sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==
+ dependencies:
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+
"@octokit/core@^6.1.4":
version "6.1.6"
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.6.tgz#302b3e7188c81e43352c6df4dfabbf897ff192c1"
@@ -942,6 +1313,19 @@
before-after-hook "^3.0.2"
universal-user-agent "^7.0.0"
+"@octokit/core@^7.0.5", "@octokit/core@^7.0.6":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.6.tgz#0d58704391c6b681dec1117240ea4d2a98ac3916"
+ integrity sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==
+ dependencies:
+ "@octokit/auth-token" "^6.0.0"
+ "@octokit/graphql" "^9.0.3"
+ "@octokit/request" "^10.0.6"
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+ before-after-hook "^4.0.0"
+ universal-user-agent "^7.0.0"
+
"@octokit/endpoint@^10.1.4":
version "10.1.4"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.4.tgz#8783be38a32b95af8bcb6523af20ab4eed7a2adb"
@@ -950,6 +1334,14 @@
"@octokit/types" "^14.0.0"
universal-user-agent "^7.0.2"
+"@octokit/endpoint@^11.0.2":
+ version "11.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.2.tgz#a8d955e053a244938b81d86cd73efd2dcb5ef5af"
+ integrity sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==
+ dependencies:
+ "@octokit/types" "^16.0.0"
+ universal-user-agent "^7.0.2"
+
"@octokit/graphql@^8.2.2":
version "8.2.2"
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.2.2.tgz#3db48c4ffdf07f99600cee513baf45e73eced4d1"
@@ -959,6 +1351,44 @@
"@octokit/types" "^14.0.0"
universal-user-agent "^7.0.0"
+"@octokit/graphql@^9.0.3":
+ version "9.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.3.tgz#5b8341c225909e924b466705c13477face869456"
+ integrity sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==
+ dependencies:
+ "@octokit/request" "^10.0.6"
+ "@octokit/types" "^16.0.0"
+ universal-user-agent "^7.0.0"
+
+"@octokit/oauth-app@^8.0.3":
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-8.0.3.tgz#56172be3be768f9c38f12a63e5ef8d6644fd7efb"
+ integrity sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==
+ dependencies:
+ "@octokit/auth-oauth-app" "^9.0.2"
+ "@octokit/auth-oauth-user" "^6.0.1"
+ "@octokit/auth-unauthenticated" "^7.0.2"
+ "@octokit/core" "^7.0.5"
+ "@octokit/oauth-authorization-url" "^8.0.0"
+ "@octokit/oauth-methods" "^6.0.1"
+ "@types/aws-lambda" "^8.10.83"
+ universal-user-agent "^7.0.0"
+
+"@octokit/oauth-authorization-url@^8.0.0":
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz#fdbab39a07d38faaad8621a5fdf04bc0c36d63e7"
+ integrity sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==
+
+"@octokit/oauth-methods@^6.0.1", "@octokit/oauth-methods@^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz#0c3da61244040cd2e9075d5949b5deed3fa6e52c"
+ integrity sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==
+ dependencies:
+ "@octokit/oauth-authorization-url" "^8.0.0"
+ "@octokit/request" "^10.0.6"
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+
"@octokit/openapi-types@^24.2.0":
version "24.2.0"
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3"
@@ -969,6 +1399,21 @@
resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz"
integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==
+"@octokit/openapi-types@^27.0.0":
+ version "27.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz#374ea53781965fd02a9d36cacb97e152cefff12d"
+ integrity sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==
+
+"@octokit/openapi-webhooks-types@12.1.0":
+ version "12.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz#6f1b2839a0d00c9524e81f16d8735ec410bce187"
+ integrity sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==
+
+"@octokit/plugin-paginate-graphql@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz#acdefd7e85ce24716e7ad7352f2df4d29d0e273b"
+ integrity sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==
+
"@octokit/plugin-paginate-rest@^11.4.2":
version "11.6.0"
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz#e5e9ff3530e867c3837fdbff94ce15a2468a1f37"
@@ -976,6 +1421,13 @@
dependencies:
"@octokit/types" "^13.10.0"
+"@octokit/plugin-paginate-rest@^14.0.0":
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz#44dc9fff2dacb148d4c5c788b573ddc044503026"
+ integrity sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==
+ dependencies:
+ "@octokit/types" "^16.0.0"
+
"@octokit/plugin-request-log@^5.3.1":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz#ccb75d9705de769b2aa82bcd105cc96eb0c00f69"
@@ -988,6 +1440,13 @@
dependencies:
"@octokit/types" "^13.10.0"
+"@octokit/plugin-rest-endpoint-methods@^17.0.0":
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz#8c54397d3a4060356a1c8a974191ebf945924105"
+ integrity sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==
+ dependencies:
+ "@octokit/types" "^16.0.0"
+
"@octokit/plugin-retry@^7.1.2":
version "7.2.1"
resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-7.2.1.tgz#3ec7065ad451c7e6bd64c4fb16c98006a5ff2f66"
@@ -997,6 +1456,23 @@
"@octokit/types" "^14.0.0"
bottleneck "^2.15.3"
+"@octokit/plugin-retry@^8.0.3":
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz#8b7af9700272df724d12fd6333ead98961d135c6"
+ integrity sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==
+ dependencies:
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+ bottleneck "^2.15.3"
+
+"@octokit/plugin-throttling@^11.0.3":
+ version "11.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz#584b1a9ca73a5daafeeb7dd5cc13a1bd29a6a60d"
+ integrity sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==
+ dependencies:
+ "@octokit/types" "^16.0.0"
+ bottleneck "^2.15.3"
+
"@octokit/request-error@^6.1.8":
version "6.1.8"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.8.tgz#3c7ce1ca6721eabd43dbddc76b44860de1fdea75"
@@ -1011,6 +1487,24 @@
dependencies:
"@octokit/types" "^14.0.0"
+"@octokit/request-error@^7.0.2":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.1.0.tgz#440fa3cae310466889778f5a222b47a580743638"
+ integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==
+ dependencies:
+ "@octokit/types" "^16.0.0"
+
+"@octokit/request@^10.0.6":
+ version "10.0.7"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.7.tgz#93f619914c523750a85e7888de983e1009eb03f6"
+ integrity sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==
+ dependencies:
+ "@octokit/endpoint" "^11.0.2"
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+ fast-content-type-parse "^3.0.0"
+ universal-user-agent "^7.0.2"
+
"@octokit/request@^9.2.3":
version "9.2.4"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.4.tgz#037400946a30f971917f47175053c1075fac713b"
@@ -1046,6 +1540,27 @@
dependencies:
"@octokit/openapi-types" "^25.1.0"
+"@octokit/types@^16.0.0":
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-16.0.0.tgz#fbd7fa590c2ef22af881b1d79758bfaa234dbb7c"
+ integrity sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==
+ dependencies:
+ "@octokit/openapi-types" "^27.0.0"
+
+"@octokit/webhooks-methods@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz#34abf78aec6f826fe561cfe79d2ebb1950d1d25f"
+ integrity sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==
+
+"@octokit/webhooks@^14.0.0":
+ version "14.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-14.2.0.tgz#db5e730fb3a2841f4dec6a1394d98589e74371d2"
+ integrity sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==
+ dependencies:
+ "@octokit/openapi-webhooks-types" "12.1.0"
+ "@octokit/request-error" "^7.0.0"
+ "@octokit/webhooks-methods" "^6.0.0"
+
"@opentelemetry/api-logs@0.208.0":
version "0.208.0"
resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz"
@@ -1053,7 +1568,7 @@
dependencies:
"@opentelemetry/api" "^1.3.0"
-"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.0":
+"@opentelemetry/api@1.9.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.0":
version "1.9.0"
resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz"
integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==
@@ -1305,6 +1820,113 @@
dependencies:
"@opentelemetry/instrumentation" ">=0.52.0 <1"
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
+
+"@reflink/reflink-darwin-arm64@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-darwin-arm64/-/reflink-darwin-arm64-0.1.19.tgz#6fa245144ae4f194dcbe48d6498cc40352da6ac0"
+ integrity sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==
+
+"@reflink/reflink-darwin-x64@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-darwin-x64/-/reflink-darwin-x64-0.1.19.tgz#2440afedf32d15c5f056594276d13c585eefcdef"
+ integrity sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==
+
+"@reflink/reflink-linux-arm64-gnu@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-linux-arm64-gnu/-/reflink-linux-arm64-gnu-0.1.19.tgz#d9c87932895abd638102ee8915891c6af1d44c79"
+ integrity sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==
+
+"@reflink/reflink-linux-arm64-musl@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-linux-arm64-musl/-/reflink-linux-arm64-musl-0.1.19.tgz#3747f92b6505c31068580765ce9ba02362e27574"
+ integrity sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==
+
+"@reflink/reflink-linux-x64-gnu@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-linux-x64-gnu/-/reflink-linux-x64-gnu-0.1.19.tgz#17f07fe33cbce47f3a62423d634d6e5730d9f28d"
+ integrity sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==
+
+"@reflink/reflink-linux-x64-musl@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-linux-x64-musl/-/reflink-linux-x64-musl-0.1.19.tgz#6e7e8c776f47209bb8aedd88bef8318a27f9036d"
+ integrity sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==
+
+"@reflink/reflink-win32-arm64-msvc@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-win32-arm64-msvc/-/reflink-win32-arm64-msvc-0.1.19.tgz#595fac71d69e149e32deb0e8da11d83e99f31b5d"
+ integrity sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==
+
+"@reflink/reflink-win32-x64-msvc@0.1.19":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink-win32-x64-msvc/-/reflink-win32-x64-msvc-0.1.19.tgz#545a378f44eaed22125191470b276b8a18e5004e"
+ integrity sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==
+
+"@reflink/reflink@^0.1.16":
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/@reflink/reflink/-/reflink-0.1.19.tgz#cb2b6e390a4a5bf56431fb64bff683fe704d704e"
+ integrity sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==
+ optionalDependencies:
+ "@reflink/reflink-darwin-arm64" "0.1.19"
+ "@reflink/reflink-darwin-x64" "0.1.19"
+ "@reflink/reflink-linux-arm64-gnu" "0.1.19"
+ "@reflink/reflink-linux-arm64-musl" "0.1.19"
+ "@reflink/reflink-linux-x64-gnu" "0.1.19"
+ "@reflink/reflink-linux-x64-musl" "0.1.19"
+ "@reflink/reflink-win32-arm64-msvc" "0.1.19"
+ "@reflink/reflink-win32-x64-msvc" "0.1.19"
+
"@rollup/rollup-android-arm-eabi@4.54.0":
version "4.54.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz#f3ff5dbde305c4fa994d49aeb0a5db5305eff03b"
@@ -1950,6 +2572,16 @@
dependencies:
tslib "^2.6.2"
+"@standard-schema/spec@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8"
+ integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==
+
+"@tinyhttp/content-disposition@^2.2.0":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@tinyhttp/content-disposition/-/content-disposition-2.2.2.tgz#1207d18bdd59e1cd38ecf2493ee187f4f592ebe7"
+ integrity sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==
+
"@tootallnate/once@2":
version "2.0.0"
resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz"
@@ -1960,6 +2592,11 @@
resolved "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz"
integrity sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==
+"@types/aws-lambda@^8.10.83":
+ version "8.10.159"
+ resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.159.tgz#0ab559f4519e42732a393b28c21564da9763c5aa"
+ integrity sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==
+
"@types/aws4@^1.5.1":
version "1.11.6"
resolved "https://registry.npmjs.org/@types/aws4/-/aws4-1.11.6.tgz"
@@ -2081,6 +2718,13 @@
dependencies:
undici-types "~6.21.0"
+"@types/node@>=13.7.0":
+ version "25.0.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.3.tgz#79b9ac8318f373fbfaaf6e2784893efa9701f269"
+ integrity sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==
+ dependencies:
+ undici-types "~7.16.0"
+
"@types/ora@^1.3.4":
version "1.3.5"
resolved "https://registry.npmjs.org/@types/ora/-/ora-1.3.5.tgz"
@@ -2282,6 +2926,11 @@
"@typescript-eslint/types" "8.50.1"
eslint-visitor-keys "^4.2.1"
+"@vercel/oidc@3.0.5":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@vercel/oidc/-/oidc-3.0.5.tgz#bd8db7ee777255c686443413492db4d98ef49657"
+ integrity sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==
+
"@vitest/expect@3.2.4":
version "3.2.4"
resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433"
@@ -2377,6 +3026,16 @@ agent-base@^7.1.2:
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
+ai@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/ai/-/ai-6.0.3.tgz#6fa7f59a0cac12ca46b3abea5ca1cdf57c3b43bf"
+ integrity sha512-OOo+/C+sEyscoLnbY3w42vjQDICioVNyS+F+ogwq6O5RJL/vgWGuiLzFwuP7oHTeni/MkmX8tIge48GTdaV7QQ==
+ dependencies:
+ "@ai-sdk/gateway" "3.0.2"
+ "@ai-sdk/provider" "3.0.0"
+ "@ai-sdk/provider-utils" "4.0.1"
+ "@opentelemetry/api" "1.9.0"
+
ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
@@ -2387,6 +3046,11 @@ ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ansi-escapes@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f"
+ integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==
+
ansi-regex@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
@@ -2414,6 +3078,19 @@ ansi-styles@^6.1.0, ansi-styles@^6.2.1:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
+"aproba@^1.0.3 || ^2.0.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1"
+ integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==
+
+are-we-there-yet@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
+ integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
@@ -2456,6 +3133,15 @@ aws4@^1.11.0:
resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz"
integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
+axios@^1.6.5:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687"
+ integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.4"
+ proxy-from-env "^1.1.0"
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
@@ -2471,6 +3157,11 @@ before-after-hook@^3.0.2:
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d"
integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==
+before-after-hook@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9"
+ integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==
+
bignumber.js@^9.0.0:
version "9.3.1"
resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz"
@@ -2485,6 +3176,11 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
+boolean@^3.0.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
+ integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
+
bottleneck@^2.15.3:
version "2.19.5"
resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz"
@@ -2533,6 +3229,11 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
+bytes@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
cac@^6.7.14:
version "6.7.14"
resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959"
@@ -2570,17 +3271,32 @@ chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^5.3.0, chalk@^5.4.1:
+ version "5.6.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea"
+ integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==
+
check-error@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc"
integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==
+chmodrp@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/chmodrp/-/chmodrp-1.0.2.tgz#d1c0075dfcc97fe7f5f924252438a84bd5d26a9a"
+ integrity sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w==
+
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-ci-info@*:
+chownr@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4"
+ integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==
+
+ci-info@*, ci-info@^4.0.0:
version "4.3.1"
resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz"
integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==
@@ -2602,7 +3318,14 @@ cli-cursor@^3.1.0:
dependencies:
restore-cursor "^3.1.0"
-cli-spinners@^2.5.0:
+cli-cursor@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38"
+ integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==
+ dependencies:
+ restore-cursor "^5.0.0"
+
+cli-spinners@^2.5.0, cli-spinners@^2.9.2:
version "2.9.2"
resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz"
integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
@@ -2614,6 +3337,15 @@ cli-table@0.3.1:
dependencies:
colors "1.0.3"
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
cliui@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-9.0.1.tgz#6f7890f386f6f1f79953adc1f78dec46fcc2d291"
@@ -2628,6 +3360,24 @@ clone@^1.0.2:
resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz"
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+cmake-js@^7.4.0:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.4.0.tgz#eb175b8abb97c86e4ba92ca7c22f5c9588b5a0ac"
+ integrity sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==
+ dependencies:
+ axios "^1.6.5"
+ debug "^4"
+ fs-extra "^11.2.0"
+ memory-stream "^1.0.0"
+ node-api-headers "^1.1.0"
+ npmlog "^6.0.2"
+ rc "^1.2.7"
+ semver "^7.5.4"
+ tar "^6.2.0"
+ url-join "^4.0.1"
+ which "^2.0.2"
+ yargs "^17.7.2"
+
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
@@ -2640,6 +3390,11 @@ color-name@~1.1.4:
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
colors@1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
@@ -2652,6 +3407,11 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
+commander@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@@ -2662,6 +3422,11 @@ consola@2.15.3:
resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz"
integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
+console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
@@ -2671,7 +3436,7 @@ cross-spawn@^7.0.6:
shebang-command "^2.0.0"
which "^2.0.1"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1:
+debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1:
version "4.4.3"
resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
@@ -2683,6 +3448,11 @@ deep-eql@^5.0.1:
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341"
integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
@@ -2695,11 +3465,44 @@ defaults@^1.0.3:
dependencies:
clone "^1.0.2"
+define-data-property@^1.0.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+detect-libc@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad"
+ integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
dunder-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
@@ -2753,7 +3556,12 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
-es-define-property@^1.0.1:
+env-var@^7.5.0:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/env-var/-/env-var-7.5.0.tgz#5f0c2d999d2997eaf7cf7f1437b3f857b865bf48"
+ integrity sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==
+
+es-define-property@^1.0.0, es-define-property@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
@@ -2785,6 +3593,11 @@ es-set-tostringtag@^2.1.0:
has-tostringtag "^1.0.2"
hasown "^2.0.2"
+es6-error@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
esbuild@^0.25.0:
version "0.25.12"
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz"
@@ -2972,6 +3785,16 @@ event-target-shim@^5.0.0:
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+eventemitter3@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
+ integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
+
+eventsource-parser@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.6.tgz#292e165e34cacbc936c3c92719ef326d4aeb4e90"
+ integrity sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==
+
expect-type@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68"
@@ -2998,6 +3821,11 @@ fast-content-type-parse@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz#c236124534ee2cb427c8d8e5ba35a4856947847b"
integrity sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==
+fast-content-type-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz#5590b6c807cc598be125e6740a9fde589d2b7afb"
+ integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
@@ -3046,6 +3874,18 @@ file-entry-cache@^8.0.0:
dependencies:
flat-cache "^4.0.0"
+filename-reserved-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz#3d5dd6d4e2d73a3fed2ebc4cd0b3448869a081f7"
+ integrity sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==
+
+filenamify@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-6.0.0.tgz#38def94098c62154c42a41d822650f5f55bcbac2"
+ integrity sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==
+ dependencies:
+ filename-reserved-regex "^3.0.0"
+
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@@ -3062,11 +3902,21 @@ flat-cache@^4.0.0:
flatted "^3.2.9"
keyv "^4.5.4"
+flatbuffers@^25.1.24:
+ version "25.9.23"
+ resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-25.9.23.tgz#346811557fe9312ab5647535e793c761e9c81eb1"
+ integrity sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==
+
flatted@^3.2.9:
version "3.3.3"
resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+follow-redirects@^1.15.6:
+ version "1.15.11"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
+ integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
+
foreground-child@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
@@ -3103,6 +3953,15 @@ forwarded-parse@2.1.2:
resolved "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz"
integrity sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==
+fs-extra@^11.1.1, fs-extra@^11.2.0, fs-extra@^11.3.0:
+ version "11.3.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee"
+ integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
@@ -3125,6 +3984,20 @@ function-bind@^1.1.2:
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+gauge@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
+ integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.3"
+ console-control-strings "^1.1.0"
+ has-unicode "^2.0.1"
+ signal-exit "^3.0.7"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.5"
+
gaxios@^6.0.0, gaxios@^6.0.2, gaxios@^6.1.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb"
@@ -3150,7 +4023,7 @@ get-caller-file@^2.0.0, get-caller-file@^2.0.5:
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-east-asian-width@^1.0.0:
+get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6"
integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==
@@ -3241,11 +4114,31 @@ glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
+global-agent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
+ integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
+ dependencies:
+ boolean "^3.0.1"
+ es6-error "^4.1.1"
+ matcher "^3.0.0"
+ roarr "^2.15.3"
+ semver "^7.3.2"
+ serialize-error "^7.0.1"
+
globals@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+globalthis@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
google-auth-library@^9.6.3:
version "9.15.1"
resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928"
@@ -3263,11 +4156,16 @@ google-logging-utils@^0.0.2:
resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a"
integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==
-gopd@^1.2.0:
+gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
gtoken@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26"
@@ -3276,11 +4174,23 @@ gtoken@^7.0.0:
gaxios "^6.0.0"
jws "^4.0.0"
+guid-typescript@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc"
+ integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==
+
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-property-descriptors@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
has-symbols@^1.0.3, has-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
@@ -3293,6 +4203,11 @@ has-tostringtag@^1.0.2:
dependencies:
has-symbols "^1.0.3"
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
@@ -3340,7 +4255,7 @@ ignore@^5.2.0:
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
-ignore@^7.0.0:
+ignore@^7.0.0, ignore@^7.0.4:
version "7.0.5"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9"
integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
@@ -3381,11 +4296,43 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
inversify@^5.0.0:
version "5.1.1"
resolved "https://registry.npmjs.org/inversify/-/inversify-5.1.1.tgz"
integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==
+ipull@^3.9.2:
+ version "3.9.3"
+ resolved "https://registry.yarnpkg.com/ipull/-/ipull-3.9.3.tgz#0363196c52a1045e89069a57584dfb67dcfb2cd5"
+ integrity sha512-ZMkxaopfwKHwmEuGDYx7giNBdLxbHbRCWcQVA1D2eqE4crUguupfxej6s7UqbidYEwT69dkyumYkY8DPHIxF9g==
+ dependencies:
+ "@tinyhttp/content-disposition" "^2.2.0"
+ async-retry "^1.3.3"
+ chalk "^5.3.0"
+ ci-info "^4.0.0"
+ cli-spinners "^2.9.2"
+ commander "^10.0.0"
+ eventemitter3 "^5.0.1"
+ filenamify "^6.0.0"
+ fs-extra "^11.1.1"
+ is-unicode-supported "^2.0.0"
+ lifecycle-utils "^2.0.1"
+ lodash.debounce "^4.0.8"
+ lowdb "^7.0.1"
+ pretty-bytes "^6.1.0"
+ pretty-ms "^8.0.0"
+ sleep-promise "^9.1.0"
+ slice-ansi "^7.1.0"
+ stdout-update "^4.0.1"
+ strip-ansi "^7.1.0"
+ optionalDependencies:
+ "@reflink/reflink" "^0.1.16"
+
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
@@ -3403,6 +4350,13 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-fullwidth-code-point@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98"
+ integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==
+ dependencies:
+ get-east-asian-width "^1.3.1"
+
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
@@ -3415,6 +4369,11 @@ is-interactive@^1.0.0:
resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+is-interactive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90"
+ integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==
+
is-ssh@^1.4.0:
version "1.4.1"
resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz"
@@ -3432,11 +4391,26 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-unicode-supported@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714"
+ integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==
+
+is-unicode-supported@^2.0.0, is-unicode-supported@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a"
+ integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+isexe@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d"
+ integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==
+
jackspeak@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae"
@@ -3473,6 +4447,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+json-schema@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
@@ -3483,6 +4462,15 @@ json-stringify-safe@^5.0.1:
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+jsonfile@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62"
+ integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
jwa@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804"
@@ -3520,6 +4508,16 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
+lifecycle-utils@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/lifecycle-utils/-/lifecycle-utils-2.1.0.tgz#447c6849aa36692a0d2327937c8f2d3b1411f4db"
+ integrity sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA==
+
+lifecycle-utils@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lifecycle-utils/-/lifecycle-utils-3.0.1.tgz#e9f306582e57138a44b316d68eccbdadc35cb1c7"
+ integrity sha512-Qt/Jl5dsNIsyCAZsHB6x3mbwHFn0HJbdmvF49sVX/bHgX2cW7+G+U+I67Zw+TPM1Sr21Gb2nfJMd2g6iUcI1EQ==
+
locate-path@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
@@ -3527,6 +4525,11 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
@@ -3540,11 +4543,39 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
+log-symbols@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439"
+ integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==
+ dependencies:
+ chalk "^5.3.0"
+ is-unicode-supported "^1.3.0"
+
+log-symbols@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-7.0.1.tgz#f52e68037d96f589fc572ff2193dc424d48c195b"
+ integrity sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==
+ dependencies:
+ is-unicode-supported "^2.0.0"
+ yoctocolors "^2.1.1"
+
+long@^5.0.0, long@^5.2.3:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83"
+ integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
+
loupe@^3.1.0, loupe@^3.1.4:
version "3.2.1"
resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76"
integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==
+lowdb@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-7.0.1.tgz#7354a684547d76206b1c730b9434604235b125e5"
+ integrity sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==
+ dependencies:
+ steno "^4.0.2"
+
lru-cache@^11.0.0:
version "11.2.2"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz"
@@ -3562,11 +4593,25 @@ marked@^17.0.1:
resolved "https://registry.yarnpkg.com/marked/-/marked-17.0.1.tgz#9db34197ac145e5929572ee49ef701e37ee9b2e6"
integrity sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==
+matcher@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
+ integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+memory-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/memory-stream/-/memory-stream-1.0.0.tgz#481dfd259ccdf57b03ec2c9632960044180e73c2"
+ integrity sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==
+ dependencies:
+ readable-stream "^3.4.0"
+
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
@@ -3589,6 +4634,11 @@ mimic-fn@^2.1.0:
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+mimic-function@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076"
+ integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
+
minimatch@^10.1.1:
version "10.1.1"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz"
@@ -3610,7 +4660,12 @@ minimatch@^9.0.0, minimatch@^9.0.4:
dependencies:
brace-expansion "^2.0.1"
-minipass@*, minipass@^7.1.2:
+minimist@^1.2.0:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@*, minipass@^7.0.4, minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
@@ -3635,6 +4690,13 @@ minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
+minizlib@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c"
+ integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==
+ dependencies:
+ minipass "^7.1.2"
+
mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
@@ -3660,6 +4722,11 @@ nanoid@^3.3.11:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+nanoid@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.6.tgz#30363f664797e7d40429f6c16946d6bd7a3f26c9"
+ integrity sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
@@ -3674,6 +4741,16 @@ nock@^13.2.4:
json-stringify-safe "^5.0.1"
propagate "^2.0.0"
+node-addon-api@^8.3.1:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f"
+ integrity sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==
+
+node-api-headers@^1.1.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.7.0.tgz#e629ce89698fc6cd83d4a65499d87b7eb3e620f1"
+ integrity sha512-uJMGdkhVwu9+I3UsVvI3KW6ICAy/yDfsu5Br9rSnTtY3WpoaComXvKloiV5wtx0Md2rn0B9n29Ys2WMNwWxj9A==
+
node-fetch@^2.6.1, node-fetch@^2.6.9:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
@@ -3681,11 +4758,92 @@ node-fetch@^2.6.1, node-fetch@^2.6.9:
dependencies:
whatwg-url "^5.0.0"
+node-llama-cpp@^3.14.5:
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/node-llama-cpp/-/node-llama-cpp-3.14.5.tgz#ad0d0ace680170d4499d889b9ac89ee8f32d210d"
+ integrity sha512-Db+RFqFMJOOVWprUINq77LVe44FaiJ6JvNiq14r2+DZRgkgyxckSZa6DcZ5Xe5MC+hGA5aqOdnNxsrudUcs74Q==
+ dependencies:
+ "@huggingface/jinja" "^0.5.3"
+ async-retry "^1.3.3"
+ bytes "^3.1.2"
+ chalk "^5.4.1"
+ chmodrp "^1.0.2"
+ cmake-js "^7.4.0"
+ cross-spawn "^7.0.6"
+ env-var "^7.5.0"
+ filenamify "^6.0.0"
+ fs-extra "^11.3.0"
+ ignore "^7.0.4"
+ ipull "^3.9.2"
+ is-unicode-supported "^2.1.0"
+ lifecycle-utils "^3.0.1"
+ log-symbols "^7.0.0"
+ nanoid "^5.1.5"
+ node-addon-api "^8.3.1"
+ octokit "^5.0.3"
+ ora "^8.2.0"
+ pretty-ms "^9.2.0"
+ proper-lockfile "^4.1.2"
+ semver "^7.7.1"
+ simple-git "^3.27.0"
+ slice-ansi "^7.1.0"
+ stdout-update "^4.0.1"
+ strip-ansi "^7.1.0"
+ validate-npm-package-name "^6.0.0"
+ which "^5.0.0"
+ yargs "^17.7.2"
+ optionalDependencies:
+ "@node-llama-cpp/linux-arm64" "3.14.5"
+ "@node-llama-cpp/linux-armv7l" "3.14.5"
+ "@node-llama-cpp/linux-x64" "3.14.5"
+ "@node-llama-cpp/linux-x64-cuda" "3.14.5"
+ "@node-llama-cpp/linux-x64-cuda-ext" "3.14.5"
+ "@node-llama-cpp/linux-x64-vulkan" "3.14.5"
+ "@node-llama-cpp/mac-arm64-metal" "3.14.5"
+ "@node-llama-cpp/mac-x64" "3.14.5"
+ "@node-llama-cpp/win-arm64" "3.14.5"
+ "@node-llama-cpp/win-x64" "3.14.5"
+ "@node-llama-cpp/win-x64-cuda" "3.14.5"
+ "@node-llama-cpp/win-x64-cuda-ext" "3.14.5"
+ "@node-llama-cpp/win-x64-vulkan" "3.14.5"
+
+npmlog@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
+ integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
+ dependencies:
+ are-we-there-yet "^3.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^4.0.3"
+ set-blocking "^2.0.0"
+
nvar@1.3.1:
version "1.3.1"
resolved "https://registry.npmjs.org/nvar/-/nvar-1.3.1.tgz"
integrity sha512-2U58nVI2o0SXvjiTiQ6UdXpfNu0/A6rqvjCPk7bEsqQujXWDkmLdKppMkh3UXXAvfX9b2LSs1YYYkX2uNE/oAg==
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+octokit@^5.0.3:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/octokit/-/octokit-5.0.5.tgz#8122c8db5c818381839ccc1980295abd9909548f"
+ integrity sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==
+ dependencies:
+ "@octokit/app" "^16.1.2"
+ "@octokit/core" "^7.0.6"
+ "@octokit/oauth-app" "^8.0.3"
+ "@octokit/plugin-paginate-graphql" "^6.0.0"
+ "@octokit/plugin-paginate-rest" "^14.0.0"
+ "@octokit/plugin-rest-endpoint-methods" "^17.0.0"
+ "@octokit/plugin-retry" "^8.0.3"
+ "@octokit/plugin-throttling" "^11.0.3"
+ "@octokit/request-error" "^7.0.2"
+ "@octokit/types" "^16.0.0"
+ "@octokit/webhooks" "^14.0.0"
+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
@@ -3700,6 +4858,44 @@ onetime@^5.1.0:
dependencies:
mimic-fn "^2.1.0"
+onetime@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60"
+ integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==
+ dependencies:
+ mimic-function "^5.0.0"
+
+onnxruntime-common@1.21.0:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz#a81d4191d418acbbff2546a954cc2cc23eeb09f8"
+ integrity sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==
+
+onnxruntime-common@1.22.0-dev.20250409-89f8206ba4:
+ version "1.22.0-dev.20250409-89f8206ba4"
+ resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz#3d4a39563b93db3d0428b5527cba58a3c8f826c2"
+ integrity sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==
+
+onnxruntime-node@1.21.0:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz#7f4f59455baf851181e207fc8401288ac2eb10d1"
+ integrity sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==
+ dependencies:
+ global-agent "^3.0.0"
+ onnxruntime-common "1.21.0"
+ tar "^7.0.1"
+
+onnxruntime-web@1.22.0-dev.20250409-89f8206ba4:
+ version "1.22.0-dev.20250409-89f8206ba4"
+ resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz#d1e3a04e03dfee392b41d420ef547b6a0351b06b"
+ integrity sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==
+ dependencies:
+ flatbuffers "^25.1.24"
+ guid-typescript "^1.0.9"
+ long "^5.2.3"
+ onnxruntime-common "1.22.0-dev.20250409-89f8206ba4"
+ platform "^1.3.6"
+ protobufjs "^7.2.4"
+
optionator@^0.9.3:
version "0.9.4"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
@@ -3727,6 +4923,21 @@ ora@5.4.0:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
+ora@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-8.2.0.tgz#8fbbb7151afe33b540dd153f171ffa8bd38e9861"
+ integrity sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==
+ dependencies:
+ chalk "^5.3.0"
+ cli-cursor "^5.0.0"
+ cli-spinners "^2.9.2"
+ is-interactive "^2.0.0"
+ is-unicode-supported "^2.0.0"
+ log-symbols "^6.0.0"
+ stdin-discarder "^0.2.2"
+ string-width "^7.2.0"
+ strip-ansi "^7.1.0"
+
p-limit@^3.0.1, p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
@@ -3753,6 +4964,16 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-ms@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e"
+ integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==
+
+parse-ms@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4"
+ integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
+
parse-path@*, parse-path@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.1.0.tgz#41fb513cb122831807a4c7b29c8727947a09d8c6"
@@ -3837,6 +5058,11 @@ picomatch@^4.0.2, picomatch@^4.0.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
+platform@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7"
+ integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==
+
postcss@^8.5.6:
version "8.5.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
@@ -3878,6 +5104,25 @@ prettier@^3.4.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f"
integrity sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==
+pretty-bytes@^6.1.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b"
+ integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==
+
+pretty-ms@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3"
+ integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==
+ dependencies:
+ parse-ms "^3.0.0"
+
+pretty-ms@^9.2.0:
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.3.0.tgz#dd2524fcb3c326b4931b2272dfd1e1a8ed9a9f5a"
+ integrity sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==
+ dependencies:
+ parse-ms "^4.0.0"
+
prompts@2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz"
@@ -3891,11 +5136,43 @@ propagate@^2.0.0:
resolved "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz"
integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==
+proper-lockfile@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
+ integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ retry "^0.12.0"
+ signal-exit "^3.0.2"
+
+protobufjs@^7.2.4:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a"
+ integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
protocols@^2.0.0, protocols@^2.0.1:
version "2.0.2"
resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz"
integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
pump@^3.0.0:
version "3.0.3"
resolved "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz"
@@ -3909,7 +5186,17 @@ punycode@^2.1.0:
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
-readable-stream@^3.1.1, readable-stream@^3.4.0:
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -3923,6 +5210,11 @@ reflect-metadata@^0.1.12:
resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz"
integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
require-in-the-middle@^8.0.0:
version "8.0.1"
resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz"
@@ -3944,6 +5236,14 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
+restore-cursor@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7"
+ integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==
+ dependencies:
+ onetime "^7.0.0"
+ signal-exit "^4.1.0"
+
retry-request@^7.0.0:
version "7.0.2"
resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-7.0.2.tgz#60bf48cfb424ec01b03fca6665dee91d06dd95f3"
@@ -3958,6 +5258,11 @@ retry@0.13.1:
resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"
integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
rimraf@2.7.1:
version "2.7.1"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
@@ -3965,6 +5270,18 @@ rimraf@2.7.1:
dependencies:
glob "^7.1.3"
+roarr@^2.15.3:
+ version "2.15.4"
+ resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
+ integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
+ dependencies:
+ boolean "^3.0.1"
+ detect-node "^2.0.4"
+ globalthis "^1.0.1"
+ json-stringify-safe "^5.0.1"
+ semver-compare "^1.0.0"
+ sprintf-js "^1.1.2"
+
rollup@^4.43.0:
version "4.54.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.54.0.tgz#930f4dfc41ff94d720006f9f62503612a6c319b8"
@@ -4001,11 +5318,62 @@ safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-semver@^7.6.0:
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+
+semver@^7.3.2, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1, semver@^7.7.3:
version "7.7.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+sharp@^0.34.1:
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0"
+ integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==
+ dependencies:
+ "@img/colour" "^1.0.0"
+ detect-libc "^2.1.2"
+ semver "^7.7.3"
+ optionalDependencies:
+ "@img/sharp-darwin-arm64" "0.34.5"
+ "@img/sharp-darwin-x64" "0.34.5"
+ "@img/sharp-libvips-darwin-arm64" "1.2.4"
+ "@img/sharp-libvips-darwin-x64" "1.2.4"
+ "@img/sharp-libvips-linux-arm" "1.2.4"
+ "@img/sharp-libvips-linux-arm64" "1.2.4"
+ "@img/sharp-libvips-linux-ppc64" "1.2.4"
+ "@img/sharp-libvips-linux-riscv64" "1.2.4"
+ "@img/sharp-libvips-linux-s390x" "1.2.4"
+ "@img/sharp-libvips-linux-x64" "1.2.4"
+ "@img/sharp-libvips-linuxmusl-arm64" "1.2.4"
+ "@img/sharp-libvips-linuxmusl-x64" "1.2.4"
+ "@img/sharp-linux-arm" "0.34.5"
+ "@img/sharp-linux-arm64" "0.34.5"
+ "@img/sharp-linux-ppc64" "0.34.5"
+ "@img/sharp-linux-riscv64" "0.34.5"
+ "@img/sharp-linux-s390x" "0.34.5"
+ "@img/sharp-linux-x64" "0.34.5"
+ "@img/sharp-linuxmusl-arm64" "0.34.5"
+ "@img/sharp-linuxmusl-x64" "0.34.5"
+ "@img/sharp-wasm32" "0.34.5"
+ "@img/sharp-win32-arm64" "0.34.5"
+ "@img/sharp-win32-ia32" "0.34.5"
+ "@img/sharp-win32-x64" "0.34.5"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
@@ -4028,17 +5396,17 @@ siginfo@^2.0.0:
resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30"
integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==
-signal-exit@^3.0.2:
+signal-exit@^3.0.2, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-signal-exit@^4.0.1:
+signal-exit@^4.0.1, signal-exit@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-simple-git@^3.6.0:
+simple-git@^3.27.0, simple-git@^3.6.0:
version "3.30.0"
resolved "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz"
integrity sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==
@@ -4052,6 +5420,19 @@ sisteransi@^1.0.5:
resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+sleep-promise@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/sleep-promise/-/sleep-promise-9.1.0.tgz#101ebe65700bcd184709da95d960967b02b79d03"
+ integrity sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==
+
+slice-ansi@^7.1.0:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403"
+ integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==
+ dependencies:
+ ansi-styles "^6.2.1"
+ is-fullwidth-code-point "^5.0.0"
+
source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
@@ -4077,6 +5458,11 @@ split@1.0.1:
dependencies:
through "2"
+sprintf-js@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
+ integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
+
stackback@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b"
@@ -4087,6 +5473,26 @@ std-env@^3.9.0:
resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b"
integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==
+stdin-discarder@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be"
+ integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==
+
+stdout-update@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/stdout-update/-/stdout-update-4.0.1.tgz#63ce952ccd6a40de7eeb288e9c609ff70f1fa540"
+ integrity sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==
+ dependencies:
+ ansi-escapes "^6.2.0"
+ ansi-styles "^6.2.1"
+ string-width "^7.1.0"
+ strip-ansi "^7.1.0"
+
+steno@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/steno/-/steno-4.0.2.tgz#9bd9b0ffc226a1f9436f29132c8b8e7199d22c50"
+ integrity sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==
+
stream-events@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz"
@@ -4116,7 +5522,7 @@ string-length@3.1.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string-width@^4.1.0:
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -4134,7 +5540,7 @@ string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string-width@^7.0.0, string-width@^7.2.0:
+string-width@^7.0.0, string-width@^7.1.0, string-width@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc"
integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==
@@ -4183,6 +5589,11 @@ strip-json-comments@^3.1.1:
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
strip-literal@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.1.0.tgz#222b243dd2d49c0bcd0de8906adbd84177196032"
@@ -4212,7 +5623,7 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
-tar@6.2.1:
+tar@6.2.1, tar@^6.2.0:
version "6.2.1"
resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz"
integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
@@ -4224,6 +5635,17 @@ tar@6.2.1:
mkdirp "^1.0.3"
yallist "^4.0.0"
+tar@^7.0.1:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.2.tgz#115c061495ec51ff3c6745ff8f6d0871c5b1dedc"
+ integrity sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==
+ dependencies:
+ "@isaacs/fs-minipass" "^4.0.0"
+ chownr "^3.0.0"
+ minipass "^7.1.2"
+ minizlib "^3.1.0"
+ yallist "^5.0.0"
+
teeny-request@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-9.0.0.tgz#18140de2eb6595771b1b02203312dfad79a4716d"
@@ -4278,6 +5700,11 @@ tmp@0.2.4:
resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz"
integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==
+toad-cache@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/toad-cache/-/toad-cache-3.7.0.tgz#b9b63304ea7c45ec34d91f1d2fa513517025c441"
+ integrity sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==
+
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
@@ -4293,7 +5720,7 @@ tslib@^1.7.1, tslib@^1.8.1:
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.6.2:
+tslib@^2.4.0, tslib@^2.6.2:
version "2.8.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -4333,6 +5760,11 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
typescript-eslint@^8.18.2:
version "8.50.1"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.50.1.tgz#047df900e568757bc791b6b1ab6fa5fbed9b2393"
@@ -4353,11 +5785,26 @@ undici-types@~6.21.0:
resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz"
integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
+undici-types@~7.16.0:
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46"
+ integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
+
+universal-github-app-jwt@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz#38537e5a7d154085a35f97601a5e30e9e17717df"
+ integrity sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==
+
universal-user-agent@^7.0.0, universal-user-agent@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be"
integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
@@ -4365,6 +5812,11 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+url-join@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
+ integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
+
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
@@ -4380,6 +5832,11 @@ uuid@^9.0.0, uuid@^9.0.1:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
+validate-npm-package-name@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz#4e8d2c4d939975a73dd1b7a65e8f08d44c85df96"
+ integrity sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==
+
vite-node@3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07"
@@ -4405,6 +5862,11 @@ vite-node@3.2.4:
optionalDependencies:
fsevents "~2.3.3"
+vitest-evals@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/vitest-evals/-/vitest-evals-0.5.0.tgz#543f3c59ad7ffe7f05437d85666836ffa1512a9f"
+ integrity sha512-kg8r6NKNBD6jkmyjdO64qduATW6IUG+62atCJj3dLzaRZEG4TIdfFVy64iEh0dSSo1CCpAJi+dJqSN2Y2qv2Sw==
+
vitest@^3.0.2:
version "3.2.4"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea"
@@ -4454,13 +5916,20 @@ whatwg-url@^5.0.0:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
-which@^2.0.1:
+which@^2.0.1, which@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
+which@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/which/-/which-5.0.0.tgz#d93f2d93f79834d4363c7d0c23e00d07c466c8d6"
+ integrity sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==
+ dependencies:
+ isexe "^3.1.1"
+
why-is-node-running@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04"
@@ -4469,12 +5938,19 @@ why-is-node-running@^2.3.0:
siginfo "^2.0.0"
stackback "0.0.2"
+wide-align@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -4521,11 +5997,34 @@ yallist@^4.0.0:
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+yallist@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533"
+ integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
yargs-parser@^22.0.0:
version "22.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8"
integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
yargs@^18:
version "18.0.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-18.0.0.tgz#6c84259806273a746b09f579087b68a3c2d25bd1"
@@ -4551,6 +6050,11 @@ yocto-queue@^0.1.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+yoctocolors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a"
+ integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==
+
zod@^3.24.1:
version "3.25.76"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34"