diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 683a81a..b7b8e0b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: with: version: "0.12.3" enable-cache: true - - run: uv sync --locked --dev --extra braintrust + - run: uv sync --locked --dev - run: uv run ruff format --check . - run: uv run ruff check . - run: uv run ty check diff --git a/README.md b/README.md index b2c2a31..febba85 100644 --- a/README.md +++ b/README.md @@ -36,42 +36,6 @@ The backend supports task environments defined by either: CPU, memory, and storage values map to Hypeman vCPUs, base memory, and writable overlay size. Harbor `public` and `no-network` modes map to attached and detached Hypeman networking. -## Braintrust reporting - -Install the official Braintrust integration with the backend: - -```bash -uv tool install harbor \ - --with harbor-hypeman \ - --with 'braintrust>=0.33.0' -``` - -Then add the official Harbor plugin to a run: - -```bash -harbor run \ - --dataset ./tasks \ - --agent codex \ - --model openai/gpt-5.6 \ - --env harbor_hypeman:HypemanEnvironment \ - --plugin braintrust -``` - -Set the Braintrust credentials required by your project before running the command. - -This repository includes two pinned `kernel-mcp-server` tasks for reproducible backend and reporting checks: - -```bash -harbor run \ - --dataset ./evals/kernel-mcp-server \ - --agent codex \ - --model openai/gpt-5.6 \ - --env harbor_hypeman:HypemanEnvironment \ - --plugin braintrust -``` - -The tasks start from fixed source commits and use focused hidden Bun tests for browser-region forwarding and MCP client-capability parsing. - ## Behavior - Dockerfile builds are cached by Harbor environment content hash and rebuilt with `--force-build`. diff --git a/evals/kernel-mcp-server/browser-region/environment/Dockerfile b/evals/kernel-mcp-server/browser-region/environment/Dockerfile deleted file mode 100644 index 9cdeb6f..0000000 --- a/evals/kernel-mcp-server/browser-region/environment/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM oven/bun:1.3.3-debian - -RUN apt-get update \ - && apt-get install -y --no-install-recommends git ca-certificates \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /workspace -RUN git clone https://github.com/kernel/kernel-mcp-server.git . \ - && git checkout --detach 2d98491389b6a129fec797e0f35c6b5e4ab9d695 \ - && rm -rf .git \ - && bun install --frozen-lockfile diff --git a/evals/kernel-mcp-server/browser-region/instruction.md b/evals/kernel-mcp-server/browser-region/instruction.md deleted file mode 100644 index f7ba4a9..0000000 --- a/evals/kernel-mcp-server/browser-region/instruction.md +++ /dev/null @@ -1,12 +0,0 @@ -Add an optional `region` parameter to the `manage_browsers` MCP tool. - -Requirements: - -- Accept only `us-east` or `eu-west`. -- For `action: "create"`, forward `region` to `client.browsers.create`. -- For `action: "list"`, forward `region` to `client.browsers.list`. -- Do not pass `region` to unrelated actions. -- Document in the schema that the region is fixed after browser creation and that listing uses it as a filter. -- Add focused tests for create and list forwarding. - -Work in `/workspace`. Run the relevant Bun tests before finishing. diff --git a/evals/kernel-mcp-server/browser-region/task.toml b/evals/kernel-mcp-server/browser-region/task.toml deleted file mode 100644 index c4d29da..0000000 --- a/evals/kernel-mcp-server/browser-region/task.toml +++ /dev/null @@ -1,27 +0,0 @@ -schema_version = "1.1" - -[task] -name = "kernel-mcp-server/browser-region" -description = "Add browser-region support to the Kernel MCP server" -authors = [{ name = "Kernel" }] -keywords = ["mcp", "typescript", "kernel"] - -[agent] -timeout_sec = 900.0 - -[verifier] -timeout_sec = 300.0 - -[environment] -build_timeout_sec = 900.0 -cpus = 2 -memory_mb = 4096 -storage_mb = 10240 -network_mode = "public" -workdir = "/workspace" - -[environment.env] - -[verifier.env] - -[solution.env] diff --git a/evals/kernel-mcp-server/browser-region/tests/browser-region.test.ts b/evals/kernel-mcp-server/browser-region/tests/browser-region.test.ts deleted file mode 100644 index d5220da..0000000 --- a/evals/kernel-mcp-server/browser-region/tests/browser-region.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -/// - -import { describe, expect, test } from "bun:test"; -import { connectTestMcp, toolResultJSON } from "@/lib/mcp/mcp-test-fixtures"; -import { registerBrowserCapabilities } from "@/lib/mcp/tools/browsers"; - -describe("manage_browsers region", () => { - test("forwards region only for create and list", async () => { - const createCalls: unknown[] = []; - const listCalls: unknown[] = []; - const getCalls: unknown[] = []; - const kernelClient = { - browsers: { - create: async (params: unknown) => { - createCalls.push(params); - return { session_id: "brr_created" }; - }, - list: async (params: unknown) => { - listCalls.push(params); - return { - getPaginatedItems: () => [{ session_id: "brr_eu" }], - has_more: false, - next_offset: null, - }; - }, - retrieve: async (sessionId: string) => { - getCalls.push(sessionId); - return { session_id: sessionId }; - }, - }, - }; - const { client, close } = await connectTestMcp( - registerBrowserCapabilities, - kernelClient, - ); - - try { - const created = toolResultJSON( - await client.callTool({ - name: "manage_browsers", - arguments: { action: "create", region: "eu-west", stealth: true }, - }), - ); - expect(createCalls).toEqual([{ stealth: true, region: "eu-west" }]); - expect(created.browser.session_id).toBe("brr_created"); - - const listed = toolResultJSON( - await client.callTool({ - name: "manage_browsers", - arguments: { action: "list", region: "eu-west", limit: 5 }, - }), - ); - expect(listCalls).toEqual([{ region: "eu-west", limit: 5 }]); - expect(listed.items).toEqual([{ session_id: "brr_eu" }]); - - await client.callTool({ - name: "manage_browsers", - arguments: { - action: "get", - session_id: "brr_created", - region: "eu-west", - }, - }); - expect(getCalls).toEqual(["brr_created"]); - } finally { - await close(); - } - }); - - test("rejects unknown regions", async () => { - const { client, close } = await connectTestMcp( - registerBrowserCapabilities, - { browsers: {} }, - ); - try { - const result = await client.callTool({ - name: "manage_browsers", - arguments: { action: "list", region: "moon-1" }, - }); - expect(result.isError).toBe(true); - } finally { - await close(); - } - }); -}); diff --git a/evals/kernel-mcp-server/browser-region/tests/test.sh b/evals/kernel-mcp-server/browser-region/tests/test.sh deleted file mode 100755 index 0ce4089..0000000 --- a/evals/kernel-mcp-server/browser-region/tests/test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -set -u -mkdir -p /logs/verifier -cp /tests/browser-region.test.ts /workspace/src/lib/mcp/tools/harbor-browser-region.test.ts -cd /workspace -bun test src/lib/mcp/tools/harbor-browser-region.test.ts 2>&1 | tee /logs/verifier/test-output.txt -status=${PIPESTATUS[0]} -if [ "$status" -eq 0 ]; then - echo 1 > /logs/verifier/reward.txt -else - echo 0 > /logs/verifier/reward.txt -fi -exit "$status" diff --git a/evals/kernel-mcp-server/client-capabilities/environment/Dockerfile b/evals/kernel-mcp-server/client-capabilities/environment/Dockerfile deleted file mode 100644 index 8cc3c04..0000000 --- a/evals/kernel-mcp-server/client-capabilities/environment/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM oven/bun:1.3.3-debian - -RUN apt-get update \ - && apt-get install -y --no-install-recommends git ca-certificates \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /workspace -RUN git clone https://github.com/kernel/kernel-mcp-server.git . \ - && git checkout --detach 5914b5ab53c4ecc40ce6eab819ca5cfba74a9a56 \ - && rm -rf .git \ - && bun install --frozen-lockfile diff --git a/evals/kernel-mcp-server/client-capabilities/instruction.md b/evals/kernel-mcp-server/client-capabilities/instruction.md deleted file mode 100644 index afd57a7..0000000 --- a/evals/kernel-mcp-server/client-capabilities/instruction.md +++ /dev/null @@ -1,13 +0,0 @@ -Centralize parsing of client-declared MCP capabilities and use it in the MCP Apps gate. - -Create `src/lib/mcp/client-capabilities.ts` with: - -- constants for the official Apps, Tasks, OAuth Client Credentials, and Enterprise Managed Authorization extension identifiers -- `isRecord(value)` for non-array objects -- `initializeClientCapabilities(body)` that accepts only a valid `initialize` request with an object capability map -- `clientDeclaresExtension(capabilities, extension)` that counts an extension only when its settings are an object -- `clientElicitationModes(capabilities)` that returns normalized `supportsFormMode` and `supportsUrlMode` booleans and rejects malformed mode settings - -Update `mcp-apps-gate.ts` to use the shared parser and re-export the Apps extension constant. Preserve the existing Redis fallback behavior. - -Work in `/workspace`. Run the focused Bun tests before finishing. diff --git a/evals/kernel-mcp-server/client-capabilities/task.toml b/evals/kernel-mcp-server/client-capabilities/task.toml deleted file mode 100644 index 30ef5ed..0000000 --- a/evals/kernel-mcp-server/client-capabilities/task.toml +++ /dev/null @@ -1,27 +0,0 @@ -schema_version = "1.1" - -[task] -name = "kernel-mcp-server/client-capabilities" -description = "Centralize MCP client-capability parsing" -authors = [{ name = "Kernel" }] -keywords = ["mcp", "typescript", "kernel"] - -[agent] -timeout_sec = 900.0 - -[verifier] -timeout_sec = 300.0 - -[environment] -build_timeout_sec = 900.0 -cpus = 2 -memory_mb = 4096 -storage_mb = 10240 -network_mode = "public" -workdir = "/workspace" - -[environment.env] - -[verifier.env] - -[solution.env] diff --git a/evals/kernel-mcp-server/client-capabilities/tests/client-capabilities.test.ts b/evals/kernel-mcp-server/client-capabilities/tests/client-capabilities.test.ts deleted file mode 100644 index 5a7fbe1..0000000 --- a/evals/kernel-mcp-server/client-capabilities/tests/client-capabilities.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -/// - -import { describe, expect, test } from "bun:test"; -import { - clientDeclaresExtension, - clientElicitationModes, - initializeClientCapabilities, - isRecord, - MCP_APPS_EXTENSION, - MCP_ENTERPRISE_MANAGED_AUTHORIZATION_EXTENSION, - MCP_OAUTH_CLIENT_CREDENTIALS_EXTENSION, - MCP_TASKS_EXTENSION, -} from "@/lib/mcp/client-capabilities"; -import { initializeDeclaresMcpApps } from "@/lib/mcp/tools/mcp-apps-gate"; - -describe("client capability parsing", () => { - test("extracts only object capabilities from initialize", () => { - const capabilities = { sampling: {}, extensions: {} }; - expect( - initializeClientCapabilities({ - method: "initialize", - params: { capabilities }, - }), - ).toBe(capabilities); - expect(initializeClientCapabilities({ method: "tools/list" })).toBeNull(); - expect( - initializeClientCapabilities({ - method: "initialize", - params: { capabilities: [] }, - }), - ).toBeNull(); - }); - - test("requires extension settings to be objects", () => { - expect( - clientDeclaresExtension( - { extensions: { [MCP_APPS_EXTENSION]: {} } }, - MCP_APPS_EXTENSION, - ), - ).toBe(true); - for (const invalid of [true, "enabled", [], null]) { - expect( - clientDeclaresExtension( - { extensions: { [MCP_APPS_EXTENSION]: invalid } }, - MCP_APPS_EXTENSION, - ), - ).toBe(false); - } - }); - - test("normalizes form and URL elicitation modes", () => { - expect(clientElicitationModes({ elicitation: { form: {} } })).toEqual({ - supportsFormMode: true, - supportsUrlMode: false, - }); - expect(clientElicitationModes({ elicitation: { url: {} } })).toEqual({ - supportsFormMode: false, - supportsUrlMode: true, - }); - expect( - clientElicitationModes({ elicitation: { form: {}, url: {} } }), - ).toEqual({ supportsFormMode: true, supportsUrlMode: true }); - expect( - clientElicitationModes({ elicitation: { form: true, url: [] } }), - ).toEqual({ supportsFormMode: false, supportsUrlMode: false }); - }); - - test("exports the official extension identifiers", () => { - expect(MCP_APPS_EXTENSION).toBe("io.modelcontextprotocol/ui"); - expect(MCP_TASKS_EXTENSION).toBe("io.modelcontextprotocol/tasks"); - expect(MCP_OAUTH_CLIENT_CREDENTIALS_EXTENSION).toBe( - "io.modelcontextprotocol/oauth-client-credentials", - ); - expect(MCP_ENTERPRISE_MANAGED_AUTHORIZATION_EXTENSION).toBe( - "io.modelcontextprotocol/enterprise-managed-authorization", - ); - expect(isRecord({})).toBe(true); - expect(isRecord([])).toBe(false); - }); - - test("uses strict extension parsing in the MCP Apps initialize gate", () => { - expect( - initializeDeclaresMcpApps({ - method: "initialize", - params: { - capabilities: { extensions: { [MCP_APPS_EXTENSION]: {} } }, - }, - }), - ).toBe(true); - expect( - initializeDeclaresMcpApps({ - method: "initialize", - params: { - capabilities: { extensions: { [MCP_APPS_EXTENSION]: true } }, - }, - }), - ).toBe(false); - }); -}); diff --git a/evals/kernel-mcp-server/client-capabilities/tests/test.sh b/evals/kernel-mcp-server/client-capabilities/tests/test.sh deleted file mode 100755 index bfadd17..0000000 --- a/evals/kernel-mcp-server/client-capabilities/tests/test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -set -u -mkdir -p /logs/verifier -cp /tests/client-capabilities.test.ts /workspace/src/lib/mcp/harbor-client-capabilities.test.ts -cd /workspace -bun test src/lib/mcp/harbor-client-capabilities.test.ts 2>&1 | tee /logs/verifier/test-output.txt -status=${PIPESTATUS[0]} -if [ "$status" -eq 0 ]; then - echo 1 > /logs/verifier/reward.txt -else - echo 0 > /logs/verifier/reward.txt -fi -exit "$status" diff --git a/pyproject.toml b/pyproject.toml index 01815c9..86702a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,9 +13,6 @@ dependencies = [ "pathspec>=1.0.3", ] -[project.optional-dependencies] -braintrust = ["braintrust>=0.33.0"] - [dependency-groups] dev = [ "pytest>=8.4.2", diff --git a/uv.lock b/uv.lock index 2a9d8c7..9a264fa 100644 --- a/uv.lock +++ b/uv.lock @@ -164,27 +164,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] -[[package]] -name = "braintrust" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "chevron" }, - { name = "exceptiongroup" }, - { name = "jsonschema" }, - { name = "packaging" }, - { name = "python-slugify" }, - { name = "requests" }, - { name = "sseclient-py" }, - { name = "tqdm" }, - { name = "typing-extensions" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/90/7048758ddd226aac6097e67df67309a3906cb1ba218fe405635731cfa102/braintrust-0.34.0.tar.gz", hash = "sha256:fd66a1eeec2fd912f7ac04faf4f0f508aaa2d03baf36390a18389d3983e7a85c", size = 833512, upload-time = "2026-08-17T19:29:22.572Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/d7/7847337ccde8494556d1df68864c2f63587ecbd37d9b50569e292903d461/braintrust-0.34.0-py3-none-any.whl", hash = "sha256:790725f5775dc6c7247e1c59d983f2681b02d4754d818009a326668faf36a039", size = 970254, upload-time = "2026-08-17T19:29:20.98Z" }, -] - [[package]] name = "certifi" version = "2026.7.22" @@ -410,15 +389,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, ] -[[package]] -name = "chevron" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/1f/ca74b65b19798895d63a6e92874162f44233467c9e7c1ed8afd19016ebe9/chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf", size = 11440, upload-time = "2021-01-02T22:47:59.233Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/93/342cc62a70ab727e093ed98e02a725d85b746345f05d2b5e5034649f4ec8/chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443", size = 11595, upload-time = "2021-01-02T22:47:57.847Z" }, -] - [[package]] name = "click" version = "8.4.2" @@ -532,18 +502,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/6c/79cd5bc1b880d8c1a9a5550aa8dacd57353fa3bb2457227e1fb47383eb49/dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6", size = 14845, upload-time = "2023-07-18T13:36:06.052Z" }, ] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - [[package]] name = "fastapi" version = "0.141.1" @@ -773,11 +731,6 @@ dependencies = [ { name = "pathspec" }, ] -[package.optional-dependencies] -braintrust = [ - { name = "braintrust" }, -] - [package.dev-dependencies] dev = [ { name = "pytest" }, @@ -788,13 +741,11 @@ dev = [ [package.metadata] requires-dist = [ - { name = "braintrust", marker = "extra == 'braintrust'", specifier = ">=0.33.0" }, { name = "dockerfile-parse", specifier = ">=2.0.1" }, { name = "harbor", specifier = ">=0.21.0,<0.22" }, { name = "hypeman", specifier = ">=0.1.0,<0.2" }, { name = "pathspec", specifier = ">=1.0.3" }, ] -provides-extras = ["braintrust"] [package.metadata.requires-dev] dev = [ @@ -1605,18 +1556,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/17/c5c6b53ddc18f297992099b3d9ec16c855c0ccc83263a21fe4d1c625ec6c/python_dotenv-1.2.3-py3-none-any.whl", hash = "sha256:904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9", size = 22780, upload-time = "2026-08-16T16:54:52.473Z" }, ] -[[package]] -name = "python-slugify" -version = "8.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "text-unidecode" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" @@ -1968,14 +1907,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] -[[package]] -name = "sseclient-py" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/2e/59920f7d66b7f9932a3d83dd0ec53fab001be1e058bf582606fe414a5198/sseclient_py-1.9.0-py3-none-any.whl", hash = "sha256:340062b1587fc2880892811e2ab5b176d98ef3eee98b3672ff3a3ba1e8ed0f6f", size = 8351, upload-time = "2026-01-02T23:39:30.995Z" }, -] - [[package]] name = "starlette" version = "1.6.0" @@ -2068,15 +1999,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, ] -[[package]] -name = "text-unidecode" -version = "1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, -] - [[package]] name = "tiktoken" version = "0.14.0" @@ -2293,70 +2215,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] -[[package]] -name = "wrapt" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/b0/c1f5a970721f06b85c0cd5142e0ff8fe067708abd779b0c4f4be7d61d09f/wrapt-2.3.0.tar.gz", hash = "sha256:681a2d0eefd721998f90642762b8e75c2159ec531b20ad5e437245ea7b06a107", size = 131509, upload-time = "2026-07-28T06:06:14.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/4a/d17a0fad1bf1c5f2c887ff71fef75654141b0880bff71d157d955b5bec3a/wrapt-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0a45ffae742ce91a16e11cb6c7cd71e7f9994f3cbd283b962ab093f5c6dcf525", size = 82139, upload-time = "2026-07-28T06:04:35.082Z" }, - { url = "https://files.pythonhosted.org/packages/6e/55/51b92daaf6defb57f4dc56bdcce985400f75c6984a03ca5e78ccac717028/wrapt-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69e477046f2237ef0bc6547544ee73008dc764ca26eff44f09e976d221b34d5d", size = 82723, upload-time = "2026-07-28T06:04:36.502Z" }, - { url = "https://files.pythonhosted.org/packages/28/7f/cfd9bc4b1f5e424eeea83d0493e43f3b1b02707ce8e50c47945873982bd5/wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d221a6e6ddd302b8397433184e96b59f259f50024b854db1c411a881586b6b8", size = 172381, upload-time = "2026-07-28T06:04:37.674Z" }, - { url = "https://files.pythonhosted.org/packages/cb/89/ff7814f6eb6856b479946117d1138a2fbb46cdb6b1f379db359056c69743/wrapt-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:392158c9a7f2ab1b8699418bfc0fe6f83548788c418b27d7bf2019ad3405cebb", size = 174120, upload-time = "2026-07-28T06:04:38.987Z" }, - { url = "https://files.pythonhosted.org/packages/12/1e/8eded8615d39e3ce81f626937a3a87b280a2a86239a2bf14a4b4bb345034/wrapt-2.3.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e5301c35cf75655eb33498f2bd6ae8703ca19940e3167dc9cdf740c712a39c60", size = 163035, upload-time = "2026-07-28T06:04:40.361Z" }, - { url = "https://files.pythonhosted.org/packages/35/ea/a0af2d9da62897af2a055484920de05dade30d2ba2c0d65cbdea875d3d8b/wrapt-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:418f54bb09d1762db02c7009b4051149893af3153a87f92d70356703c11eea02", size = 171887, upload-time = "2026-07-28T06:04:41.614Z" }, - { url = "https://files.pythonhosted.org/packages/7e/dd/63cd4c864c65ef4906df64bd2d378f4a62b54f28063f282dfb3bf93caead/wrapt-2.3.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1598becd30f8f2777d18564064eb4f4dbe1ab0e05a8f09786d0ef505ac782bf3", size = 161113, upload-time = "2026-07-28T06:04:42.864Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ee/82f1fc9e431b5c2c5a6d201aa865dbeae3984c311c6d11a185f0c8367cf6/wrapt-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3da470536bf9645143323dd41b32db55c6f4304ad382094c1a1da8a92061e10d", size = 170530, upload-time = "2026-07-28T06:04:44.212Z" }, - { url = "https://files.pythonhosted.org/packages/37/a5/5dc590e863a419930d988f8b7ca3e75a6befcfb10b6003b3a152f3d5f732/wrapt-2.3.0-cp312-cp312-win32.whl", hash = "sha256:fb8e2e6704a1e0b1b989546c69e2688371ef4a07fa5f61bde3eb6211186f5ac1", size = 78323, upload-time = "2026-07-28T06:04:45.484Z" }, - { url = "https://files.pythonhosted.org/packages/51/f9/4a6925a07951df56394f7e6ebe14f69f1c5ef9d87aa63e0839acf15aa63a/wrapt-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cdc021cb0b62471d6aac7f2bd92f3b4658073775f9ee7fcd325c511129e7bcc8", size = 81180, upload-time = "2026-07-28T06:04:47.021Z" }, - { url = "https://files.pythonhosted.org/packages/a8/4f/8b5de0395b2a72216751d41c9861df6facaeb611b619d8810ed2b3b23eb2/wrapt-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:67bfe2485f50368c3fcd2275fc1fd100e350d601e0058921a7c82678a465aeab", size = 80155, upload-time = "2026-07-28T06:04:48.373Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6e/0f88a072483e76b881e3fdcd6b6ffb4a5791002514fe541e72b1b73c859a/wrapt-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d3fb71e65b001adfc42684522eeccd9c21d8ba679945abc993439567b66e59f", size = 81960, upload-time = "2026-07-28T06:04:49.622Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ff/b7e2776e7c294075eb712cc9ef573d1b818f393006d09787262b8fc871c4/wrapt-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51a7a4181c1295774812271fbcd7c909df372bc25579d4ed9eb875caaf0ae86f", size = 82435, upload-time = "2026-07-28T06:04:50.9Z" }, - { url = "https://files.pythonhosted.org/packages/d8/90/343bb5d0f1f9669bc252a6073f085b4abf862511bd5c9c9eaec754341f1d/wrapt-2.3.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9045917809c63fdf7abe3a2ceaed3d670b8ee4500ddd9291192d30aeb34467c5", size = 170350, upload-time = "2026-07-28T06:04:52.187Z" }, - { url = "https://files.pythonhosted.org/packages/59/f8/13b79a392930bd0dd6b86cbfbfe1c40944110456e1dc6d809e5c46ece904/wrapt-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54ca1d5573f69b5fe1d74f1f65799c68015e82f685efec9fd8cfa40a094c44d0", size = 170022, upload-time = "2026-07-28T06:04:53.599Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fc/4f1b6918f5290db959d6e0c07f77385d87cede29c39c9cf8f145e9c82954/wrapt-2.3.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:242b60c21e30866e6a2fa606c612b47c553fa60c0eaeeeb7797fb842ac0ce609", size = 161043, upload-time = "2026-07-28T06:04:54.936Z" }, - { url = "https://files.pythonhosted.org/packages/01/e1/45d3cf74414780bdff6d0380467e003f6eb0f028b6c9403db868dbc7209c/wrapt-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3f3d7ec0a51fbfe00d3aef047641ff2c58b25565b4717fc1f90e050be01cba8", size = 168576, upload-time = "2026-07-28T06:04:56.261Z" }, - { url = "https://files.pythonhosted.org/packages/f3/73/2fa58dd97f191c997755e2c6d569a68f0c433db4e4b36099bdd7227b6cac/wrapt-2.3.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:261f53870cd4fb2bf38f9f972c56c728fd224cb7c65721307de59d9e7e6741ae", size = 159140, upload-time = "2026-07-28T06:04:57.754Z" }, - { url = "https://files.pythonhosted.org/packages/29/a8/08a56e2000a8816d449dcbad8c8b081697acbbd490821ceca0f9d8e8d20c/wrapt-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8159ec0b0cb7608175eb150de94c19e34f4d47ac655f5ca9baf45df6b688ffd3", size = 169263, upload-time = "2026-07-28T06:04:59.161Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d4/354e1725e35a73b2af4fa70a3e024c7a5d1bf1802dfb862dcb668aae0253/wrapt-2.3.0-cp313-cp313-win32.whl", hash = "sha256:10461884b3014fbfc8eb7d09a93c5f246363e6711d9d881f95eb8c27fdef049f", size = 78241, upload-time = "2026-07-28T06:05:00.507Z" }, - { url = "https://files.pythonhosted.org/packages/6c/7e/34c87fa2174848dfee820322aaa318bab08913998ccecc8d2f57b4ad4639/wrapt-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:ac870cc97b73bb00ac353329e9559a4bebc47c4c86792ed9b23b58c15b6ad838", size = 81113, upload-time = "2026-07-28T06:05:01.839Z" }, - { url = "https://files.pythonhosted.org/packages/11/86/fcc9a530579e008c9478bb565a6cdfbfd33536660f069c8b91a6607c5050/wrapt-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:a65e8db2b4e90c2e7ade931086351c98ef420bf7a94ee08c95ac8a3cbbc43579", size = 80182, upload-time = "2026-07-28T06:05:03.152Z" }, - { url = "https://files.pythonhosted.org/packages/96/50/3864848b95b28ef73e17551fc8dccbff2628a834f52cf26a57f9c419fb83/wrapt-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:fd1f2f557dd3491fe75905e578f4db967393d40d1a8f468edc4d40ac7f2d5944", size = 83921, upload-time = "2026-07-28T06:05:04.476Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4c/3d1921a60c3e8c71c540ff136e6a47a1fbccf7f671e818394889f7871d9c/wrapt-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9f5d2aec29dfc76c37e23897dee92766a3fd4f3bff3ae7fc9c6b4bf37d8c1360", size = 84412, upload-time = "2026-07-28T06:05:05.921Z" }, - { url = "https://files.pythonhosted.org/packages/fa/1a/4a796ff7adb26ada6d4b758c94d47a38320b085e7099afc088efbbcdb006/wrapt-2.3.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:646d20d413ffcd1b0a2f700076e2d0252d872dcb7754860a73e45a59ea883614", size = 207168, upload-time = "2026-07-28T06:05:07.256Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3e/d7777776806c579b761bac2f91721dda9f04c7a1b380213c5935cc750ae6/wrapt-2.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:379f670f45b7bb8993edd9f6fc36c6cc65edb81cffa0b504be34acb0303fff0a", size = 214351, upload-time = "2026-07-28T06:05:08.945Z" }, - { url = "https://files.pythonhosted.org/packages/63/27/2d64d394df7bf181955b3bb562bf33c4492fb4be113f53071106d43ad8b5/wrapt-2.3.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6208f302f110295d64b22a7ac96500c791bf492dce4366e622e4912b077c9687", size = 199020, upload-time = "2026-07-28T06:05:10.418Z" }, - { url = "https://files.pythonhosted.org/packages/3e/3d/fb31d3db7d9834d265fb1a27a2adf0ddf51557c67458c97b22439ad6ae3d/wrapt-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ed635a9ca4f3a5a2b900c10c69e823373bc00ebc114b459383596d3487da3570", size = 209969, upload-time = "2026-07-28T06:05:11.983Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d1/8724b5da582e62070dc9bf4d8bf1972f317297eefd7ba1f2b5c6393ccf6c/wrapt-2.3.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:e3b9eaa742ae7a0aaaaad4ca4b69469d757af2d6e6663ef1dadc47adec0aeb41", size = 196324, upload-time = "2026-07-28T06:05:13.557Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5c/3d9ef411149543016ee6bcf3af707f787cebd946527452b94bf122e9b7b4/wrapt-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0f7284f88f4833705132d06d3b425a43095c2cbd07c58166aac3ab646ba12a4", size = 202610, upload-time = "2026-07-28T06:05:15.048Z" }, - { url = "https://files.pythonhosted.org/packages/13/9b/4fc042ceb757866dd4a5fc057b3b736f2b360d3703ce9f830d83dc9226e0/wrapt-2.3.0-cp313-cp313t-win32.whl", hash = "sha256:7ebb274aba688b043429eb1500ff8a76ce0cb8ac0812ca3e301f06247b8722b3", size = 79178, upload-time = "2026-07-28T06:05:16.469Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ff/b94878f8eed809ca042685276bcea9f24e8c2ca7c9653bb80bbb920a68a5/wrapt-2.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:c4bded758ad6f03b965830944a2f0bc5b2eb3767fe5a7310134315d1a6610e98", size = 82634, upload-time = "2026-07-28T06:05:18.026Z" }, - { url = "https://files.pythonhosted.org/packages/80/fb/663e1de5332a71685a729754312d327d4cada767c36e1c5a2db4c8de49e6/wrapt-2.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:d2cc64539da63e39ffb9c7ede849b6e8ddaaf7b3876b5cfb04efd85a5f3f4eb6", size = 81387, upload-time = "2026-07-28T06:05:19.417Z" }, - { url = "https://files.pythonhosted.org/packages/58/10/b073beaea89bc0d3670a75ff51139430a54b6af7ba7796507730634536dd/wrapt-2.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ea52a0d0f08c584943d5764be0e84efa912c8da23c23e1e285ff2f5641c18fcc", size = 81978, upload-time = "2026-07-28T06:05:21.133Z" }, - { url = "https://files.pythonhosted.org/packages/b3/31/0916d9cebf848ed3f1a0c1888faee421747df77331e4db2bc527a9a85988/wrapt-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd85b0aa88efdb189d6ae2f35f4526943a8f091c38599c9c31478241c819e6a1", size = 82518, upload-time = "2026-07-28T06:05:22.562Z" }, - { url = "https://files.pythonhosted.org/packages/f5/73/31c1bf0f3384062751c2094dadb314916d70aa9b6bfd26d994b4a7b393fa/wrapt-2.3.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:141ed6211286a9660d8d6702de598b43f0934b4f0eda16393f100a80f501d945", size = 170187, upload-time = "2026-07-28T06:05:23.904Z" }, - { url = "https://files.pythonhosted.org/packages/ed/25/fce087d54b79b8905f3c3c9dd5f454bbd8d8acb80b960c4a6aee5b4659b3/wrapt-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e49885a62ec4ee854d1b9e6371fda6afd219917225752abf729a3f36d4df9a5", size = 169288, upload-time = "2026-07-28T06:05:25.378Z" }, - { url = "https://files.pythonhosted.org/packages/c7/30/0d09e6dddc6b7a7230ac77f50254b5980ab4fcd22976f72f8cc8a0404458/wrapt-2.3.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d6159c9b2fefec02314e1332dbbbfaf960e369dfd26bcf7f8b258b5732065b3", size = 160932, upload-time = "2026-07-28T06:05:27.022Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ca/0913af0d2ec0c43865d32d615f518fea66c13c5c930e489e9b0de248e9a8/wrapt-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24da48596326ef8e448cfa837b454f638713d3531262375f00e5a9681682fc07", size = 169017, upload-time = "2026-07-28T06:05:28.501Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f2/3d1e47ea81b822210f5df1bf942fd90780a75c055243d569b664529dea88/wrapt-2.3.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cd3a2edf0427013736b8127955cec62608c56e53ea47e82812ea32059cda407f", size = 159065, upload-time = "2026-07-28T06:05:30.01Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/ef2066ced8e5fca204e2b361e9708e36555b40949c583d997ea3b590817d/wrapt-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0df3bff4e7ce45759f33fd39335fe2f60477bb9ecf7b8aa41e7d07ee36a23", size = 168821, upload-time = "2026-07-28T06:05:31.649Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/016104650d4e572fa91506eb396b3dd8efbccc9284fdc1c9479c3d21db28/wrapt-2.3.0-cp314-cp314-win32.whl", hash = "sha256:2935d5454b3f179a29b12cf390ee47246740ba2c3a7545b1b46ba31a5f2a4a0b", size = 78700, upload-time = "2026-07-28T06:05:33.391Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/6fdc20a9f2ca304748b3f0819cbf377d55260562777bf0b615431bc3c181/wrapt-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:cc2cea812e5cb179a796b766747e7d3b21088760d8deb95676d482b8c8e6fa7d", size = 81422, upload-time = "2026-07-28T06:05:34.774Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a4/9cbd53bf05746bea2c392af39cb052427a8ec95cbd494d930733d8f44681/wrapt-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:22cc5c0a717bd4da87018ae0bffd4c19c6fb679d3ff357216ba566ab26c76cab", size = 80639, upload-time = "2026-07-28T06:05:36.228Z" }, - { url = "https://files.pythonhosted.org/packages/43/bb/6c5e4a0f66ea0d2b2dd267e8dd05a0014eea56840b3c8595d40b0a5d1f91/wrapt-2.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a6b5984cd65dd639546f0eb4b8eacf1c31cb2fe9fb5c27bffe240987cdb2cf84", size = 84030, upload-time = "2026-07-28T06:05:37.714Z" }, - { url = "https://files.pythonhosted.org/packages/6a/eb/a1aedf03283bc9cbf8a1783995ddc54e3c5a86878f19002d2c428494f4c5/wrapt-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c88abcf53daef80e01a75c7530e727fa6e2c1888fe83e3dcdba4c96216a1f5c7", size = 84419, upload-time = "2026-07-28T06:05:39.131Z" }, - { url = "https://files.pythonhosted.org/packages/63/61/50d511c0dc5105563849e86daa3e16ac7feef699f79fb05af45ea70107d5/wrapt-2.3.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:85de890ff968196e92dd1ae73a9fb8970495e7650a457b1c9ef0ac3dd550bce2", size = 207171, upload-time = "2026-07-28T06:05:40.69Z" }, - { url = "https://files.pythonhosted.org/packages/3f/59/9b538cf7795217e810699d16bc88b96a830d9b5c403eb2ec2db6b5f2ae81/wrapt-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50f416b74d092bb9f41b424e90dd457f365f7ba4b11de62a23679769a21bd85c", size = 214329, upload-time = "2026-07-28T06:05:42.287Z" }, - { url = "https://files.pythonhosted.org/packages/b3/28/9935d62b1499e5c8b3d191e99ba4eb31ca237a0b699142011a837e9dc7ea/wrapt-2.3.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39febbee6d77301d31da6996b152ce52452da7c7ef72aba10c2fa976dff9c295", size = 199079, upload-time = "2026-07-28T06:05:43.958Z" }, - { url = "https://files.pythonhosted.org/packages/2b/01/4446b80fa2ffa47a3449b250d004ba1c1937f07f64a179608fec735df866/wrapt-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:93513bec052c6cd987f9f580c3df068c8bc4ebae6543736be3ca7ec5959cafcd", size = 209992, upload-time = "2026-07-28T06:05:45.677Z" }, - { url = "https://files.pythonhosted.org/packages/d4/07/56f26c9f9979586a021e8148747004aba4498f49458c90b0502969b904e1/wrapt-2.3.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:729126e667da34d251b8ebf8a45ef0c5ddadc21542b3d6e1abf4259ece6508df", size = 196334, upload-time = "2026-07-28T06:05:47.608Z" }, - { url = "https://files.pythonhosted.org/packages/8b/41/6d7bcc895b0f28b2250e10908f060687b9165429dcd7f22ddb3d4c031b74/wrapt-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:626b69db2021aa01671ec7bbc9740e558522bd44c18cf2ce69bf3d666a014109", size = 202644, upload-time = "2026-07-28T06:05:49.183Z" }, - { url = "https://files.pythonhosted.org/packages/cd/25/7860927edba06b758b8852a6f02e832be715563c67a6795d94350bc81099/wrapt-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:629d73378082c00a8173031f9fb30a3ac6abbc894a5bfdfae71fabc60642d501", size = 79685, upload-time = "2026-07-28T06:05:50.976Z" }, - { url = "https://files.pythonhosted.org/packages/c4/0f/270bafe92fde3b069a39bc01e39ee79340895b335640df861d43d2a51885/wrapt-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:42869085687f0aefd57c0f636c3f9354f8ffb321a8ba9cb52d19beb796e561c5", size = 83104, upload-time = "2026-07-28T06:05:52.405Z" }, - { url = "https://files.pythonhosted.org/packages/55/b3/af176d79a8515a8a720eccdad9a96f6e31a30abf2865430c8c42adf2fd13/wrapt-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b1e5aa486e269b00ed35e64771c7d0ab8096cfd2643405ca8cd60ebedc099a51", size = 81774, upload-time = "2026-07-28T06:05:53.902Z" }, - { url = "https://files.pythonhosted.org/packages/00/39/3daf9f47be208606586de4568ba6713db53ebc8fd7a575aea1fe57983b69/wrapt-2.3.0-py3-none-any.whl", hash = "sha256:d8c7ed08477429752b8c44991f40ad7838b18332a160698740a6bfbc10d998a2", size = 61866, upload-time = "2026-07-28T06:06:12.9Z" }, -] - [[package]] name = "yarl" version = "1.24.5"