diff --git a/apps/docs/src/content/docs/ecosystem/evals.md b/apps/docs/src/content/docs/ecosystem/evals.md new file mode 100644 index 000000000..c0bfec613 --- /dev/null +++ b/apps/docs/src/content/docs/ecosystem/evals.md @@ -0,0 +1,266 @@ +--- +title: Evaluating Flue Agents +description: Use Vitest Evals to evaluate Flue workflows and agents through the public app boundary. +--- + +Evals are tests for behavior quality. They help you catch regressions in answers, routing decisions, structured outputs, tool use, and conversation behavior that ordinary unit tests do not cover. + +Flue does not provide an eval runner. Use an ecosystem tool such as [Vitest Evals](https://vitest-evals.sentry.dev/docs) and point it at the Flue boundary you actually ship: workflow HTTP routes, direct agent prompts, or SDK calls. + +This guide uses `examples/evals` as its shape: a small Flue app with one HTTP-exposed workflow, one HTTP-exposed agent, and evals that run against public routes. + +## What to Evaluate + +Evaluate workflows when the behavior has a bounded input and output. Classification, extraction, summarization, ranking, and report generation are usually workflow evals because each case can assert a final structured result. + +Evaluate agents when the behavior depends on persistent conversation state. Direct agent evals should use a fresh agent instance id per case unless the case is intentionally testing memory across turns. + +Prefer the app boundary over Flue internals. Flue uses `pi-ai` internally, but most Flue users should not start with `@vitest-evals/harness-pi-ai`; that evaluates a runtime adapter rather than the workflow route, agent route, or SDK call your application exposes. + +## Install Vitest Evals + +Install Vitest and Vitest Evals in your app. Add `@flue/sdk` if your evals call Flue through the SDK instead of raw HTTP. + +```bash +npm install -D vitest vitest-evals +npm install -D @flue/sdk # optional, for SDK-based evals +``` + +Keep evals out of the default unit-test suite. Use a separate config and command: + +```json title="package.json" +{ + "scripts": { + "evals": "vitest run --config vitest.evals.config.ts", + "evals:json": "vitest run --config vitest.evals.config.ts --reporter=vitest-evals/reporter --reporter=json --outputFile.json=vitest-results.json" + } +} +``` + +```ts title="vitest.evals.config.ts" +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['evals/**/*.eval.ts'], + testTimeout: 60_000, + hookTimeout: 60_000, + reporters: ['vitest-evals/reporter'], + env: { + FLUE_EVAL_BASE_URL: process.env.FLUE_EVAL_BASE_URL ?? 'http://localhost:3583', + FLUE_EVAL_WITH_JUDGES: process.env.FLUE_EVAL_WITH_JUDGES ?? '0', + }, + }, +}); +``` + +These env vars belong to the eval process. Provider keys and model selection still need to be available to the Flue server process you are evaluating. + +## Create a Harness + +Use `createHarness(...)` to turn a Flue route call into a Vitest Evals run. The harness receives eval input, calls your app, and returns the app-facing output. + +```ts title="evals/flue.eval.ts" +import { createHarness } from 'vitest-evals'; + +type ClassificationInput = { + message: string; +}; + +type ClassificationOutput = { + category: 'billing' | 'technical' | 'account' | 'other'; + priority: 'low' | 'medium' | 'high'; + summary: string; +}; + +const baseUrl = (process.env.FLUE_EVAL_BASE_URL ?? 'http://localhost:3583').replace(/\/+$/, ''); + +const workflowHarness = createHarness({ + name: 'flue-workflow-http', + run: async ({ input, signal, setArtifact }) => { + const response = await fetch(`${baseUrl}/workflows/classify?wait=result`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(input), + signal, + }); + + const body = (await response.json()) as { + result: ClassificationOutput; + runId: string; + streamUrl: string; + offset: string; + }; + + setArtifact('runId', body.runId); + setArtifact('streamUrl', body.streamUrl); + setArtifact('offset', body.offset); + return { output: body.result }; + }, +}); +``` + +If your Flue app mounts `flue()` under a prefix, include that prefix in `FLUE_EVAL_BASE_URL`, such as `https://preview.example.com/api`. + +## Evaluate a Workflow + +An HTTP-exposed workflow exports `route` from its workflow module and is available at `POST /workflows/`. Add `?wait=result` when the eval needs the final output inline. + +```ts title="src/workflows/classify.ts" +import { createAgent, type FlueContext, type WorkflowRouteHandler } from '@flue/runtime'; +import * as v from 'valibot'; + +export const route: WorkflowRouteHandler = async (_c, next) => next(); + +const classifier = createAgent(() => ({ model: 'openai/gpt-5.5' })); + +export async function run({ init, payload }: FlueContext) { + const harness = await init(classifier); + const session = await harness.session(); + const message = + typeof payload === 'object' && payload && 'message' in payload ? String(payload.message) : ''; + + const response = await session.prompt(`Classify this support request: ${message}`, { + result: v.object({ + category: v.picklist(['billing', 'technical', 'account', 'other']), + priority: v.picklist(['low', 'medium', 'high']), + summary: v.string(), + }), + }); + + return response.data; +} +``` + +```ts title="evals/flue.eval.ts" +import { expect } from 'vitest'; +import { describeEval } from 'vitest-evals'; + +describeEval('classify workflow', { harness: workflowHarness }, (it) => { + it('returns billing triage when the request is about duplicate charges', async ({ run }) => { + const result = await run({ + message: 'I was charged twice for invoice INV-123 and need help with a refund.', + }); + + expect(result.output).toMatchObject({ category: 'billing' }); + expect(['low', 'medium', 'high']).toContain(result.output.priority); + expect(result.output.summary.trim().length).toBeGreaterThan(0); + }); +}); +``` + +The eval asserts the structured `result` returned by the workflow. The `runId` is saved as an artifact so the eval report can point back to Flue logs or run events when a case fails. + +## Evaluate an Agent + +Direct agent prompts are persistent. Use a unique agent instance id per eval case so one case does not inherit another case's session history. + +```ts title="evals/flue.eval.ts" +import { randomUUID } from 'node:crypto'; +import { createFlueClient } from '@flue/sdk'; +import { createHarness, describeEval } from 'vitest-evals'; + +const client = createFlueClient({ baseUrl }); + +const agentHarness = createHarness<{ message: string }, { instanceId: string; text: string }>({ + name: 'flue-agent-sdk', + run: async ({ input, signal, setArtifact }) => { + const instanceId = `support-eval-${randomUUID()}`; + const response = await client.agents.prompt('support', instanceId, { + message: input.message, + signal, + }); + + const promptResult = response.result as { text?: unknown }; + const text = + typeof promptResult.text === 'string' ? promptResult.text : JSON.stringify(response.result); + + setArtifact('instanceId', instanceId); + setArtifact('streamUrl', response.streamUrl); + + return { output: { instanceId, text } }; + }, +}); + +describeEval('support agent', { harness: agentHarness }, (it) => { + it('answers a billing prompt with an isolated agent instance', async ({ run }) => { + const result = await run({ + message: + 'A customer says they were charged twice for invoice INV-123. Give a concise support triage reply.', + }); + + expect(result.output.instanceId).toMatch(/^support-eval-/); + expect(result.output.text.trim().length).toBeGreaterThan(20); + expect(result.output.text.toLowerCase()).toMatch(/billing|charge|invoice|refund|payment/); + }); +}); +``` + +Use direct HTTP instead of the SDK if that is the boundary you need to verify. The SDK call above maps to `POST /agents/:name/:id?wait=result` and returns the prompt `result` with `streamUrl`, `offset`, and `submissionId`. + +## Add Assertions and Judges + +Start with ordinary deterministic assertions. They are cheaper, faster, easier to debug, and better at protecting structured contracts. + +Use judges only for checks that are genuinely semantic, such as factuality, groundedness, tone, or rubric quality. Keep the basic harness working before adding a judge. + +```ts +import { createJudge, type JudgeContext } from 'vitest-evals'; + +const classificationRubricJudge = createJudge( + 'classification-rubric', + async ( + ctx: JudgeContext, + ) => { + const correctCategory = + ctx.metadata.expectedCategory === undefined || + ctx.output.category === ctx.metadata.expectedCategory; + const hasSummary = ctx.output.summary.trim().length > 0; + + return { + score: correctCategory && hasSummary ? 1 : 0, + metadata: { + expectedCategory: ctx.metadata.expectedCategory ?? null, + actualCategory: ctx.output.category, + hasSummary, + }, + }; + }, +); + +await expect(result).toSatisfyJudge(classificationRubricJudge, { threshold: 1 }); +``` + +Model-backed judges are useful when the check cannot be expressed deterministically. The judge model is separate from the Flue app under test. Configure it through Vitest Evals using the judge harness that fits your evaluation environment. Do not reach into Flue's internal `pi-ai` runtime just to grade a shipped Flue route. + +## Running Locally and in CI + +For the simplest local setup, run the Flue dev server in one terminal and evals in another: + +```bash +pnpm run dev +FLUE_EVAL_BASE_URL=http://localhost:3583 pnpm run evals +``` + +For CI, prefer a generated server artifact so the evals exercise the same route shape you deploy: + +```yaml +- run: pnpm run build +- run: PORT=3583 node dist/server.mjs & +- run: pnpm run evals:json + env: + FLUE_EVAL_BASE_URL: http://localhost:3583 + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} +- uses: getsentry/vitest-evals@v0 + if: always() + with: + results: vitest-results.json +``` + +Add your normal readiness check before running evals. Keep model API keys in CI secrets, set provider spending limits, and avoid broad eval suites on every pull request unless you have a clear budget for them. + +## Cloudflare-Specific Evals + +Use Cloudflare dev or preview environments only when the Cloudflare platform is part of the behavior under test: Workers AI, Durable Object durability, Cloudflare Sandbox behavior, scheduled events, bindings, or platform-specific routing. + +For ordinary model behavior and workflow output quality, the same black-box harness can point at a local Node server or any deployed preview URL. Change only `FLUE_EVAL_BASE_URL`; keep the eval assertions focused on the app boundary. diff --git a/apps/docs/src/content/docs/guide/building-agents.md b/apps/docs/src/content/docs/guide/building-agents.md index 365c0d401..1f51ad737 100644 --- a/apps/docs/src/content/docs/guide/building-agents.md +++ b/apps/docs/src/content/docs/guide/building-agents.md @@ -192,6 +192,8 @@ export default createAgent(({ id }) => ({ For more information, see [Routing](/docs/guide/routing/) and [SDK](/docs/sdk/overview/). +When evaluating direct agent behavior, use a fresh agent `id` for each eval case unless the case is intentionally testing conversation memory across turns. See [Evaluating Flue Agents](/docs/ecosystem/evals/) for a black-box eval setup against public routes. + ## `dispatch()` Use `dispatch(...)` when your application receives an event for an agent asynchronously, such as a webhook, queue message, chat event, or notification. For example, an application route can verify an incoming support-system webhook and dispatch the comment to the agent for that ticket: diff --git a/apps/docs/src/content/docs/guide/observability.md b/apps/docs/src/content/docs/guide/observability.md index 82a1a61a2..c79d841db 100644 --- a/apps/docs/src/content/docs/guide/observability.md +++ b/apps/docs/src/content/docs/guide/observability.md @@ -95,6 +95,8 @@ Streaming deltas are best-effort live progress; use `message_end` as the authori You can also consume `observe(...)` directly when these integrations do not match your telemetry or data-handling requirements. +Observability shows what happened during a real run or agent operation. For behavior-quality regression checks against workflow and agent routes, use an eval runner at the application boundary; see [Evaluating Flue Agents](/docs/ecosystem/evals/). + ## Export telemetry safely Runtime events can contain workflow payloads, prompts, model messages, logs, tool values, errors, and application-owned metadata. Flue replaces image data in recognized content blocks with an omission sentinel before events are observed or persisted, but arbitrary payloads, log attributes, tool details, and results still require an application-owned sanitization policy. diff --git a/apps/docs/src/content/docs/guide/workflows.md b/apps/docs/src/content/docs/guide/workflows.md index c35d7b838..e06fe9736 100644 --- a/apps/docs/src/content/docs/guide/workflows.md +++ b/apps/docs/src/content/docs/guide/workflows.md @@ -155,6 +155,8 @@ export async function run({ init, payload }: FlueContext<{ ticket: string }>) { Use structured results when later application code depends on specific fields, instead of parsing a textual answer. See the [Agent API](/docs/api/agent-api/) for result errors, operation options, and response types. +Workflows are also a natural eval boundary when each case has bounded input and expected output. Evaluate the public workflow route, not the workflow module internals; see [Evaluating Flue Agents](/docs/ecosystem/evals/). + ## Managing workflow runs When a workflow is invoked through a running application, its `runId` lets you inspect the run independently of the HTTP request that started it. This is useful for background work, live progress, debugging, and operational tooling. diff --git a/apps/docs/src/lib/docs-navigation.ts b/apps/docs/src/lib/docs-navigation.ts index 6d8cbf64b..70bf68aa7 100644 --- a/apps/docs/src/lib/docs-navigation.ts +++ b/apps/docs/src/lib/docs-navigation.ts @@ -195,7 +195,10 @@ export const docsSections: DocsSection[] = [ landingSlug: 'ecosystem', groups: [ { - items: [{ title: 'Overview', slug: 'ecosystem', icon: 'home' }], + items: [ + { title: 'Overview', slug: 'ecosystem', icon: 'home' }, + { title: 'Evaluating Agents', slug: 'ecosystem/evals' }, + ], }, { title: 'Channels', diff --git a/apps/ecosystem-catalog.ts b/apps/ecosystem-catalog.ts index 69d541237..7fd824f14 100644 --- a/apps/ecosystem-catalog.ts +++ b/apps/ecosystem-catalog.ts @@ -374,6 +374,12 @@ export const tooling: EcosystemItem[] = [ iconClass: 'ecosystem-logo-tooling', keywords: 'sentry observability monitoring errors tracing', }, + { + name: 'Vitest Evals', + href: '/docs/ecosystem/evals/', + background: '#729b1b', + keywords: 'vitest evals evaluation regression tests behavior quality judges', + }, ].sort(sortEcosystemItems); const catalog = [...channels, ...deploy, ...databases, ...tooling, ...sandboxes]; diff --git a/examples/evals/README.md b/examples/evals/README.md new file mode 100644 index 000000000..c8e8f5b6a --- /dev/null +++ b/examples/evals/README.md @@ -0,0 +1,37 @@ +# Vitest Evals for Flue + +A small black-box eval example for a Flue app. It exposes one workflow and one agent, then evaluates the HTTP routes a deployed app would actually ship. + +## Run it + +Install workspace dependencies from the repository root: + +```bash +pnpm install +``` + +Set the provider key for your selected model. By default this example uses `openai/gpt-5.5`: + +```bash +export OPENAI_API_KEY='' +``` + +Start Flue in one terminal: + +```bash +pnpm --dir examples/evals run dev +``` + +Run evals from another terminal: + +```bash +pnpm --dir examples/evals run evals +``` + +Emit JSON for CI or the Vitest Evals report UI: + +```bash +pnpm --dir examples/evals run evals:json +``` + +Set `FLUE_EVAL_MODEL` before starting `flue dev` to use another Flue model string. Set `FLUE_EVAL_BASE_URL` before running evals if Flue is mounted somewhere other than `http://localhost:3583`. diff --git a/examples/evals/evals/flue.eval.ts b/examples/evals/evals/flue.eval.ts new file mode 100644 index 000000000..e889ed1a3 --- /dev/null +++ b/examples/evals/evals/flue.eval.ts @@ -0,0 +1,145 @@ +import { randomUUID } from 'node:crypto'; +import { createFlueClient } from '@flue/sdk'; +import { expect } from 'vitest'; +import { createHarness, createJudge, describeEval, type JudgeContext } from 'vitest-evals'; + +type ClassificationCategory = 'billing' | 'technical' | 'account' | 'other'; +type ClassificationPriority = 'low' | 'medium' | 'high'; + +type ClassificationInput = { + message: string; +}; + +type ClassificationOutput = { + category: ClassificationCategory; + priority: ClassificationPriority; + summary: string; +}; + +type ClassificationMetadata = { + expectedCategory?: ClassificationCategory; +}; + +type WorkflowResponse = { + result: ClassificationOutput; + runId: string; + streamUrl: string; + offset: string; +}; + +type AgentInput = { + message: string; +}; + +type AgentOutput = { + instanceId: string; + text: string; +}; + +type AgentPromptPayload = { + text?: unknown; +}; + +const baseUrl = (process.env.FLUE_EVAL_BASE_URL ?? 'http://localhost:3583').replace(/\/+$/, ''); +const client = createFlueClient({ baseUrl }); + +const workflowHarness = createHarness< + ClassificationInput, + ClassificationOutput, + ClassificationMetadata +>({ + name: 'flue-workflow-http', + run: async ({ input, signal, setArtifact }) => { + const response = await fetch(`${baseUrl}/workflows/classify?wait=result`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(input), + signal, + }); + const body = await readJson(response); + + setArtifact('workflow', 'classify'); + setArtifact('runId', body.runId); + setArtifact('streamUrl', body.streamUrl); + setArtifact('offset', body.offset); + + return { output: body.result }; + }, +}); + +const agentHarness = createHarness({ + name: 'flue-agent-sdk', + run: async ({ input, signal, setArtifact }) => { + const instanceId = `support-eval-${randomUUID()}`; + const response = await client.agents.prompt('support', instanceId, { + message: input.message, + signal, + }); + const result = response.result as AgentPromptPayload; + const text = typeof result.text === 'string' ? result.text : JSON.stringify(response.result); + + setArtifact('agent', 'support'); + setArtifact('instanceId', instanceId); + setArtifact('streamUrl', response.streamUrl); + setArtifact('offset', response.offset); + + return { output: { instanceId, text } }; + }, +}); + +const classificationRubricJudge = createJudge( + 'classification-rubric', + async (ctx: JudgeContext) => { + const expectedCategory = ctx.metadata.expectedCategory; + const correctCategory = + expectedCategory === undefined || ctx.output.category === expectedCategory; + const hasSummary = ctx.output.summary.trim().length > 0; + + return { + score: correctCategory && hasSummary ? 1 : 0, + metadata: { + expectedCategory: expectedCategory ?? null, + actualCategory: ctx.output.category, + hasSummary, + }, + }; + }, +); + +describeEval('classify workflow', { harness: workflowHarness }, (it) => { + it('returns billing triage when the request is about duplicate charges', async ({ run }) => { + const result = await run( + { message: 'I was charged twice for invoice INV-123 and need help with a refund.' }, + { metadata: { expectedCategory: 'billing' } }, + ); + + expect(result.output).toMatchObject({ category: 'billing' }); + expect(['low', 'medium', 'high']).toContain(result.output.priority); + expect(result.output.summary.trim().length).toBeGreaterThan(0); + + if (process.env.FLUE_EVAL_WITH_JUDGES === '1') { + await expect(result).toSatisfyJudge(classificationRubricJudge, { threshold: 1 }); + } + }); +}); + +describeEval('support agent', { harness: agentHarness }, (it) => { + it('answers a billing prompt with an isolated agent instance', async ({ run }) => { + const result = await run({ + message: + 'A customer says they were charged twice for invoice INV-123. Give a concise support triage reply.', + }); + + expect(result.output.instanceId).toMatch(/^support-eval-/); + expect(result.output.text.trim().length).toBeGreaterThan(20); + expect(result.output.text.toLowerCase()).toMatch(/billing|charge|invoice|refund|payment/); + }); +}); + +async function readJson(response: Response): Promise { + const text = await response.text(); + if (!response.ok) { + throw new Error(`Flue request failed with ${response.status}: ${text}`); + } + return JSON.parse(text) as T; +} diff --git a/examples/evals/flue.config.ts b/examples/evals/flue.config.ts new file mode 100644 index 000000000..c55cf803d --- /dev/null +++ b/examples/evals/flue.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from '@flue/cli/config'; + +export default defineConfig({}); diff --git a/examples/evals/package.json b/examples/evals/package.json new file mode 100644 index 000000000..36ad7c2d0 --- /dev/null +++ b/examples/evals/package.json @@ -0,0 +1,21 @@ +{ + "name": "example-evals", + "private": true, + "type": "module", + "scripts": { + "dev": "flue dev --target node", + "build": "flue build --target node", + "evals": "vitest run --config vitest.evals.config.ts", + "evals:json": "vitest run --config vitest.evals.config.ts --reporter=vitest-evals/reporter --reporter=json --outputFile.json=vitest-results.json" + }, + "dependencies": { + "@flue/runtime": "workspace:*", + "valibot": "^1.0.0" + }, + "devDependencies": { + "@flue/cli": "workspace:*", + "@flue/sdk": "workspace:*", + "vitest": "^4.1.9", + "vitest-evals": "^0.12.0" + } +} diff --git a/examples/evals/src/agents/support.ts b/examples/evals/src/agents/support.ts new file mode 100644 index 000000000..50ef5e37c --- /dev/null +++ b/examples/evals/src/agents/support.ts @@ -0,0 +1,13 @@ +import { type AgentRouteHandler, createAgent, defineAgentProfile } from '@flue/runtime'; + +export const route: AgentRouteHandler = async (_c, next) => next(); + +const supportProfile = defineAgentProfile({ + instructions: + 'You are a concise support triage agent. Answer in one or two sentences and mention the likely support category when it is clear.', +}); + +export default createAgent(() => ({ + model: process.env.FLUE_EVAL_MODEL ?? 'openai/gpt-5.5', + profile: supportProfile, +})); diff --git a/examples/evals/src/workflows/classify.ts b/examples/evals/src/workflows/classify.ts new file mode 100644 index 000000000..42279254e --- /dev/null +++ b/examples/evals/src/workflows/classify.ts @@ -0,0 +1,44 @@ +import { + createAgent, + defineAgentProfile, + type FlueContext, + type WorkflowRouteHandler, +} from '@flue/runtime'; +import * as v from 'valibot'; + +export const route: WorkflowRouteHandler = async (_c, next) => next(); + +const classifierProfile = defineAgentProfile({ + instructions: + 'Classify short support requests. Keep summaries under 20 words and choose the lowest priority that fits the request.', +}); + +const classifier = createAgent(() => ({ + model: process.env.FLUE_EVAL_MODEL ?? 'openai/gpt-5.5', + profile: classifierProfile, +})); + +const classificationSchema = v.object({ + category: v.picklist(['billing', 'technical', 'account', 'other']), + priority: v.picklist(['low', 'medium', 'high']), + summary: v.string(), +}); + +export async function run({ init, payload }: FlueContext) { + const harness = await init(classifier); + const session = await harness.session(); + const message = readMessage(payload); + + const response = await session.prompt( + `Classify this support request: ${JSON.stringify(message)}`, + { result: classificationSchema }, + ); + + return response.data; +} + +function readMessage(payload: unknown): string { + if (!payload || typeof payload !== 'object') return ''; + const message = (payload as { message?: unknown }).message; + return typeof message === 'string' ? message : ''; +} diff --git a/examples/evals/tsconfig.json b/examples/evals/tsconfig.json new file mode 100644 index 000000000..389e67faf --- /dev/null +++ b/examples/evals/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts", "evals/**/*.ts", "vitest.evals.config.ts"], + "exclude": ["dist"] +} diff --git a/examples/evals/vitest.evals.config.ts b/examples/evals/vitest.evals.config.ts new file mode 100644 index 000000000..5b685e9ac --- /dev/null +++ b/examples/evals/vitest.evals.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['evals/**/*.eval.ts'], + testTimeout: 60_000, + hookTimeout: 60_000, + reporters: ['vitest-evals/reporter'], + env: { + FLUE_EVAL_BASE_URL: process.env.FLUE_EVAL_BASE_URL ?? 'http://localhost:3583', + FLUE_EVAL_WITH_JUDGES: process.env.FLUE_EVAL_WITH_JUDGES ?? '0', + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c96124fc..22088160e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,7 +219,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -233,6 +233,28 @@ importers: specifier: ^4.1.6 version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) + examples/evals: + dependencies: + '@flue/runtime': + specifier: workspace:* + version: link:../../packages/runtime + valibot: + specifier: ^1.0.0 + version: 1.4.0(typescript@6.0.3) + devDependencies: + '@flue/cli': + specifier: workspace:* + version: link:../../packages/cli + '@flue/sdk': + specifier: workspace:* + version: link:../../packages/sdk + vitest: + specifier: ^4.1.9 + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) + vitest-evals: + specifier: ^0.12.0 + version: 0.12.0(ai@6.0.191(zod@4.4.3))(tinyrainbow@3.1.0)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))(zod@4.4.3) + examples/github-channel: dependencies: '@flue/github': @@ -247,7 +269,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -275,7 +297,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -347,7 +369,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -378,7 +400,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -403,7 +425,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -431,7 +453,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -508,7 +530,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -539,7 +561,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -586,7 +608,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -617,7 +639,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -645,7 +667,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -673,7 +695,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -701,7 +723,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -726,7 +748,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -754,7 +776,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -782,7 +804,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@flue/cli': specifier: workspace:* version: link:../../packages/cli @@ -850,7 +872,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -872,7 +894,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -894,7 +916,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -913,7 +935,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -954,7 +976,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -973,7 +995,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1030,7 +1052,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@notionhq/client': specifier: 5.22.0 version: 5.22.0 @@ -1147,7 +1169,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@types/node': specifier: ^22.10.10 version: 22.19.19 @@ -1239,7 +1261,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1280,7 +1302,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1302,7 +1324,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1321,7 +1343,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) '@types/node': specifier: ^22.10.10 version: 22.19.19 @@ -1352,7 +1374,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1374,7 +1396,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1393,7 +1415,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1418,7 +1440,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -1440,7 +1462,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: 0.16.15 - version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))) tsdown: specifier: ^0.22.0 version: 0.22.0(oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(tsx@4.22.3)(typescript@6.0.3) @@ -4488,9 +4510,18 @@ packages: resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} + '@vitest-evals/core@0.12.0': + resolution: {integrity: sha512-JOatlrVw4jcP9VCBAFcM07pGxUA2iLt4Ks5jaRYqyATjkNwPYnyNDL+YHgvelANfPA0BBX8MzRfs6vEkzJgC+A==} + + '@vitest-evals/report-ui@0.12.0': + resolution: {integrity: sha512-rjWKnB+WL1ekiIvHdcnEX0tfaCwfeG3BNU6jvGKuJsHqkf8JRtuTyy/xgUKKsb56CokcZ3K3hmeo6RKik/KBrQ==} + '@vitest/expect@4.1.7': resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} + '@vitest/mocker@4.1.7': resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==} peerDependencies: @@ -4502,21 +4533,47 @@ packages: vite: optional: true + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@4.1.7': resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + '@vitest/runner@4.1.7': resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} + '@vitest/snapshot@4.1.7': resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + '@vitest/spy@4.1.7': resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + '@vitest/utils@4.1.7': resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vladfrangu/async_event_emitter@2.4.7': resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -7566,6 +7623,20 @@ packages: vite: optional: true + vitest-evals@0.12.0: + resolution: {integrity: sha512-pyVA4N8gM+T2JB+SGFNSuXcgf/CHbBygAXkXR1fEPEfleKyMacJXPF9gLWIyyC1x5BCrt0r4zkwzkdjZrdpwZQ==} + hasBin: true + peerDependencies: + ai: '>=4 <7' + tinyrainbow: '>=2 <4' + vitest: '>=4 <5' + zod: '>=3 <5' + peerDependenciesMeta: + ai: + optional: true + zod: + optional: true + vitest@4.1.7: resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7607,6 +7678,47 @@ packages: jsdom: optional: true + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + volar-service-css@0.0.70: resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==} peerDependencies: @@ -8932,10 +9044,10 @@ snapshots: - utf-8-validate - workerd - '@cloudflare/vitest-pool-workers@0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))': + '@cloudflare/vitest-pool-workers@0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))': dependencies: - '@vitest/runner': 4.1.7 - '@vitest/snapshot': 4.1.7 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 cjs-module-lexer: 1.2.3 esbuild: 0.27.3 miniflare: 4.20260611.0 @@ -8947,10 +9059,10 @@ snapshots: - bufferutil - utf-8-validate - '@cloudflare/vitest-pool-workers@0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.7)(@vitest/snapshot@4.1.7)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))': + '@cloudflare/vitest-pool-workers@0.16.15(@cloudflare/workers-types@4.20260602.1)(@vitest/runner@4.1.9)(@vitest/snapshot@4.1.9)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))': dependencies: - '@vitest/runner': 4.1.7 - '@vitest/snapshot': 4.1.7 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 cjs-module-lexer: 1.2.3 esbuild: 0.27.3 miniflare: 4.20260611.0 @@ -11076,6 +11188,14 @@ snapshots: '@vercel/oidc@3.2.0': {} + '@vitest-evals/core@0.12.0': + dependencies: + zod: 4.4.3 + + '@vitest-evals/report-ui@0.12.0': + dependencies: + '@vitest-evals/core': 0.12.0 + '@vitest/expect@4.1.7': dependencies: '@standard-schema/spec': 1.1.0 @@ -11085,6 +11205,15 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 + '@vitest/expect@4.1.9': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + chai: 6.2.2 + tinyrainbow: 3.1.0 + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.7 @@ -11109,15 +11238,32 @@ snapshots: optionalDependencies: vite: 8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0) + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0) + '@vitest/pretty-format@4.1.7': dependencies: tinyrainbow: 3.1.0 + '@vitest/pretty-format@4.1.9': + dependencies: + tinyrainbow: 3.1.0 + '@vitest/runner@4.1.7': dependencies: '@vitest/utils': 4.1.7 pathe: 2.0.3 + '@vitest/runner@4.1.9': + dependencies: + '@vitest/utils': 4.1.9 + pathe: 2.0.3 + '@vitest/snapshot@4.1.7': dependencies: '@vitest/pretty-format': 4.1.7 @@ -11125,14 +11271,29 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/snapshot@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@4.1.7': {} + '@vitest/spy@4.1.9': {} + '@vitest/utils@4.1.7': dependencies: '@vitest/pretty-format': 4.1.7 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vitest/utils@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + '@vladfrangu/async_event_emitter@2.4.7': {} '@volar/kit@2.4.28(typescript@6.0.3)': @@ -14802,6 +14963,16 @@ snapshots: optionalDependencies: vite: 8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0) + vitest-evals@0.12.0(ai@6.0.191(zod@4.4.3))(tinyrainbow@3.1.0)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)))(zod@4.4.3): + dependencies: + '@vitest-evals/core': 0.12.0 + '@vitest-evals/report-ui': 0.12.0 + tinyrainbow: 3.1.0 + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) + optionalDependencies: + ai: 6.0.191(zod@4.4.3) + zod: 4.4.3 + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@22.19.19)(happy-dom@18.0.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.7 @@ -14889,6 +15060,35 @@ snapshots: transitivePeerDependencies: - msw + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(happy-dom@18.0.1)(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@24.13.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@types/node': 24.13.1 + happy-dom: 18.0.1 + transitivePeerDependencies: + - msw + volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: vscode-css-languageservice: 6.3.10